diff --git a/.cspell.json b/.cspell.json
index 4555dfa4e..f495a2e5e 100644
--- a/.cspell.json
+++ b/.cspell.json
@@ -15,6 +15,7 @@
"apimachinery",
"Archlinux",
"autoincr",
+ "automerge",
"autoscaler",
"backporting",
"backports",
@@ -71,6 +72,8 @@
"gomod",
"gonic",
"GOPATH",
+ "Gource",
+ "handlebargh",
"HEALTHCHECK",
"healthz",
"Hetzner",
@@ -78,7 +81,7 @@
"homelab",
"HTMLURL",
"HTTPFS",
- "httpsig",
+ "httpsign",
"HTTPURL",
"httputil",
"ianvs",
@@ -159,8 +162,10 @@
"seccomp",
"secprofile",
"securecookie",
+ "selfhosted",
"sess",
"shellescape",
+ "sigstore",
"Sonatype",
"SSHURL",
"sslmode",
@@ -184,6 +189,7 @@
"Traefik",
"tseslint",
"ttlcache",
+ "TUNEIT",
"Tunnelmole",
"typecheck",
"Typeflag",
@@ -195,6 +201,7 @@
"varz",
"Vieter",
"virtualisation",
+ "visualisation",
"vite",
"vueuse",
"waivable",
@@ -230,7 +237,7 @@
"Makefile",
"flake.nix",
"go.mod",
- "pipeline/rpc/proto/woodpecker.pb.go",
+ "**/*.pb.go",
"server/store/datastore/migration/**/*",
"web/components.d.ts",
"web/src/assets/locales/**/*",
@@ -238,13 +245,13 @@
"**/testdata/**",
"docs/versioned_docs/",
"package.json",
- "91-migrations.md",
// generated
"go.sum",
"flake.lock",
"pnpm-lock.yaml",
"**/node_modules/**/*",
"cmd/server/docs/docs.go",
+ "renovate.json",
// TODO: remove the following
"docs/**/*.js",
"docs/**/*.ts"
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 000000000..46dd8d027
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,11 @@
+
diff --git a/.github/renovate.json b/.github/renovate.json
index 758ff2b22..47136e9f2 100644
--- a/.github/renovate.json
+++ b/.github/renovate.json
@@ -1,12 +1,14 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["github>woodpecker-ci/renovate-config"],
+ "automergeType": "pr",
+ "enabledManagers": ["woodpecker"],
"customManagers": [
{
"customType": "regex",
"fileMatch": ["shared/constant/constant.go"],
"matchStrings": [
- "//\\s*renovate:\\s*datasource=(?.*?) depName=(?.*?)( versioning=(?.*?))?\\s+DefaultCloneImage = \"docker.io/woodpeckerci/plugin-git:(?.*)\""
+ "//\\s*renovate:\\s*datasource=(?.*?) depName=(?.*?)( versioning=(?.*?))?\\s+DefaultClonePlugin = \"docker.io/woodpeckerci/plugin-git:(?.*)\""
],
"versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}"
}
@@ -29,8 +31,8 @@
},
{
"groupName": "golang-lang",
- "matchPackagePatterns": ["^golang$", "xgo"],
- "matchUpdateTypes": ["minor", "patch"]
+ "matchUpdateTypes": ["minor", "patch"],
+ "matchPackageNames": ["/^golang$/", "/xgo/"]
},
{
"groupName": "golang-packages",
@@ -60,9 +62,10 @@
"matchFileNames": ["docs/**/package.json"]
},
{
+ "description": "Extract version from xgo container tags",
"matchDatasources": ["docker"],
- "matchPackagePatterns": ["xgo"],
- "versioning": "regex:^go-(?\\d+)?(\\.(?\\d+))?(\\.(?\\d+))$"
+ "versioning": "regex:^go-(?\\d+)\\.(?\\d+)\\.x$",
+ "matchPackageNames": ["/techknowlogick/xgo/"]
}
]
}
diff --git a/.lycheeignore b/.lycheeignore
new file mode 100644
index 000000000..fea8b85ab
--- /dev/null
+++ b/.lycheeignore
@@ -0,0 +1 @@
+https://stackoverflow.com/*
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 305726233..3f7c48de8 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -5,16 +5,16 @@ repos:
- id: check-hooks-apply
- id: check-useless-excludes
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.6.0
+ rev: v5.0.0
hooks:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/golangci/golangci-lint
- rev: v1.59.1
+ rev: v1.61.0
hooks:
- id: golangci-lint
- repo: https://github.com/igorshubovych/markdownlint-cli
- rev: v0.41.0
+ rev: v0.42.0
hooks:
- id: markdownlint
exclude: '^(docs/versioned_docs/.*|CHANGELOG.md)$'
@@ -24,7 +24,7 @@ repos:
- id: checkmake
exclude: '^docker/Dockerfile.make$' # actually a Dockerfile and not a makefile
- repo: https://github.com/hadolint/hadolint
- rev: v2.13.0-beta
+ rev: v2.13.1-beta
hooks:
- id: hadolint
- repo: https://github.com/pre-commit/mirrors-prettier
diff --git a/.woodpecker/binaries.yaml b/.woodpecker/binaries.yaml
index d67c58574..d50953fe1 100644
--- a/.woodpecker/binaries.yaml
+++ b/.woodpecker/binaries.yaml
@@ -2,12 +2,14 @@ when:
- event: tag
- event: pull_request
branch: ${CI_REPO_DEFAULT_BRANCH}
- path: Makefile
+ path:
+ - Makefile
+ - .woodpecker/binaries.yaml
variables:
- - &golang_image 'docker.io/golang:1.22'
- - &node_image 'docker.io/node:22-alpine'
- - &xgo_image 'docker.io/techknowlogick/xgo:go-1.22.x'
+ - &golang_image 'docker.io/golang:1.23'
+ - &node_image 'docker.io/node:23-alpine'
+ - &xgo_image 'docker.io/techknowlogick/xgo:go-1.23.1'
# cspell:words bindata netgo
@@ -97,7 +99,7 @@ steps:
release:
depends_on:
- checksums
- image: woodpeckerci/plugin-release:0.1.0
+ image: woodpeckerci/plugin-release:0.2.1
settings:
api_key:
from_secret: github_token
diff --git a/.woodpecker/docker.yaml b/.woodpecker/docker.yaml
index a1f00d0eb..a9945e2f3 100644
--- a/.woodpecker/docker.yaml
+++ b/.woodpecker/docker.yaml
@@ -1,8 +1,8 @@
variables:
- - &golang_image 'docker.io/golang:1.22'
- - &node_image 'docker.io/node:22-alpine'
- - &xgo_image 'docker.io/techknowlogick/xgo:go-1.22.x'
- - &buildx_plugin 'docker.io/woodpeckerci/plugin-docker-buildx:4.1.0'
+ - &golang_image 'docker.io/golang:1.23'
+ - &node_image 'docker.io/node:23-alpine'
+ - &xgo_image 'docker.io/techknowlogick/xgo:go-1.23.1'
+ - &buildx_plugin 'docker.io/woodpeckerci/plugin-docker-buildx:5.0.0'
- &platforms_release 'linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/amd64,linux/ppc64le,linux/riscv64,linux/s390x,freebsd/arm64,freebsd/amd64,openbsd/arm64,openbsd/amd64'
- &platforms_server 'linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le,linux/riscv64'
- &platforms_preview 'linux/amd64'
diff --git a/.woodpecker/docs.yaml b/.woodpecker/docs.yaml
index bc59052d6..fb3d52c15 100644
--- a/.woodpecker/docs.yaml
+++ b/.woodpecker/docs.yaml
@@ -1,7 +1,7 @@
variables:
- - &golang_image 'docker.io/golang:1.22'
- - &node_image 'docker.io/node:21-alpine'
- - &alpine_image 'docker.io/alpine:3.19'
+ - &golang_image 'docker.io/golang:1.23'
+ - &node_image 'docker.io/node:23-alpine'
+ - &alpine_image 'docker.io/alpine:3.20'
- path: &when_path
- 'docs/**'
- '.woodpecker/docs.yaml'
@@ -60,7 +60,7 @@ steps:
- event: manual
deploy-preview:
- image: docker.io/woodpeckerci/plugin-surge-preview:1.3.0
+ image: docker.io/woodpeckerci/plugin-surge-preview:1.3.2
settings:
path: 'docs/build/'
surge_token:
diff --git a/.woodpecker/release-helper.yaml b/.woodpecker/release-helper.yaml
index b9c19c553..df3739a37 100644
--- a/.woodpecker/release-helper.yaml
+++ b/.woodpecker/release-helper.yaml
@@ -1,9 +1,8 @@
steps:
- release-helper:
- image: woodpeckerci/plugin-ready-release-go:1.2.0
- pull: true
+ - name: release-helper
+ image: woodpeckerci/plugin-ready-release-go:2.0.0
settings:
- release_branch: ${CI_REPO_DEFAULT_BRANCH}
+ release_branch: ${CI_COMMIT_BRANCH}
forge_type: github
git_email: woodpecker-bot@obermui.de
github_token:
@@ -11,6 +10,8 @@ steps:
when:
- event: push
- branch: ${CI_REPO_DEFAULT_BRANCH}
+ branch:
+ - ${CI_REPO_DEFAULT_BRANCH}
+ - release/*
- event: manual
evaluate: 'TASK == "release-helper"'
diff --git a/.woodpecker/securityscan.yaml b/.woodpecker/securityscan.yaml
index fb2e28971..919ed4f4f 100644
--- a/.woodpecker/securityscan.yaml
+++ b/.woodpecker/securityscan.yaml
@@ -6,19 +6,21 @@ when:
- renovate/*
variables:
- - &trivy_plugin docker.io/woodpeckerci/plugin-trivy:1.1.0
+ - &trivy_plugin docker.io/woodpeckerci/plugin-trivy:1.2.0
steps:
backend:
depends_on: []
image: *trivy_plugin
settings:
+ server: server
skip-dirs: web/,docs/
docs:
depends_on: []
image: *trivy_plugin
settings:
+ server: server
skip-dirs: node_modules/,plugins/woodpecker-plugins/node_modules/
dir: docs/
@@ -26,5 +28,18 @@ steps:
depends_on: []
image: *trivy_plugin
settings:
+ server: server
skip-dirs: node_modules/
dir: web/
+
+services:
+ server:
+ image: *trivy_plugin
+ # settings:
+ # service: true
+ # db-repository: docker.io/aquasec/trivy-db:2
+ environment:
+ PLUGIN_SERVICE: 'true'
+ PLUGIN_DB_REPOSITORY: 'docker.io/aquasec/trivy-db:2'
+ ports:
+ - 10000
diff --git a/.woodpecker/static.yaml b/.woodpecker/static.yaml
index 17b9f0e9f..f5f1acdb3 100644
--- a/.woodpecker/static.yaml
+++ b/.woodpecker/static.yaml
@@ -13,7 +13,7 @@ steps:
branch: renovate/*
- name: spellcheck
- image: docker.io/node:22-alpine
+ image: docker.io/node:23-alpine
depends_on: []
commands:
- corepack enable
@@ -23,15 +23,15 @@ steps:
- tree --gitignore -I 012_columns_rename_procs_to_steps.go -I versioned_docs -I '*opensource.svg'| pnpx cspell lint --no-progress stdin
- name: prettier
- image: docker.io/woodpeckerci/plugin-prettier:0.1.0
+ image: docker.io/woodpeckerci/plugin-prettier:0.2.0
depends_on: []
settings:
- version: 3.2.5
+ version: 3.3.3
- name: links
image: docker.io/lycheeverse/lychee:0.15.1
depends_on: []
commands:
- lychee pipeline/frontend/yaml/linter/schema/schema.json
- - lychee --exclude localhost docs/docs/
- - lychee --exclude localhost docs/src/pages/
+ - lychee --user-agent "curl/8.4.0" --exclude localhost docs/docs/
+ - lychee --user-agent "curl/8.4.0" --exclude localhost docs/src/pages/
diff --git a/.woodpecker/test.yaml b/.woodpecker/test.yaml
index cf0d443fa..faa3f3e89 100644
--- a/.woodpecker/test.yaml
+++ b/.woodpecker/test.yaml
@@ -1,5 +1,5 @@
variables:
- - &golang_image 'docker.io/golang:1.22'
+ - &golang_image 'docker.io/golang:1.23'
- &when
- path: &when_path # related config files
- '.woodpecker/test.yaml'
@@ -40,6 +40,7 @@ steps:
- go run go.woodpecker-ci.org/woodpecker/v2/cmd/cli lint
environment:
WOODPECKER_DISABLE_UPDATE_CHECK: true
+ WOODPECKER_PLUGINS_PRIVILEGED: 'docker.io/woodpeckerci/plugin-docker-buildx:5.0.0'
when:
- event: pull_request
path:
@@ -128,7 +129,7 @@ steps:
- test
- sqlite
pull: true
- image: docker.io/woodpeckerci/plugin-codecov:2.1.2
+ image: docker.io/woodpeckerci/plugin-codecov:2.1.5
settings:
files:
- agent-coverage.out
@@ -144,7 +145,7 @@ steps:
services:
postgres:
- image: docker.io/postgres:16
+ image: docker.io/postgres:17
ports: ['5432']
environment:
POSTGRES_USER: postgres
@@ -152,7 +153,7 @@ services:
when: *when
mysql:
- image: docker.io/mysql:8.2.0
+ image: docker.io/mysql:9.1.0
ports: ['3306']
environment:
MYSQL_DATABASE: test
diff --git a/.woodpecker/web.yaml b/.woodpecker/web.yaml
index b64f33f5c..5825d2b74 100644
--- a/.woodpecker/web.yaml
+++ b/.woodpecker/web.yaml
@@ -6,7 +6,7 @@ when:
- renovate/*
variables:
- - &node_image 'docker.io/node:22-alpine'
+ - &node_image 'docker.io/node:23-alpine'
- &when
path:
# related config files
@@ -58,6 +58,7 @@ steps:
test:
depends_on:
- install-dependencies
+ - format-check # wait for it else test artifacts are falsely detected as wrong
image: *node_image
directory: web/
commands:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2d999b699..1acf8854a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,71 @@
# Changelog
+## [2.7.2](https://github.com/woodpecker-ci/woodpecker/releases/tag/v2.7.2) - 2024-11-03
+
+### Important
+
+To secure your instance, set `WOODPECKER_PLUGINS_PRIVILEGED` to only allow specific versions of the `woodpeckerci/plugin-docker-buildx` plugin, use version 5.0.0 or above. This prevents older, potentially unstable versions from being privileged.
+
+For example, to allow only version 5.0.0, use:
+
+```bash
+WOODPECKER_PLUGINS_PRIVILEGED=woodpeckerci/plugin-docker-buildx:5.0.0
+```
+
+To allow multiple versions, you can separate them with commas:
+
+```bash
+WOODPECKER_PLUGINS_PRIVILEGED=woodpeckerci/plugin-docker-buildx:5.0.0,woodpeckerci/plugin-docker-buildx:5.1.0
+```
+
+This setup ensures only specified, stable plugin versions are given privileged access.
+
+Read more about it in [#4213](https://github.com/woodpecker-ci/woodpecker/pull/4213)
+
+### ❤️ Thanks to all contributors! ❤️
+
+@6543, @anbraten, @j04n-f, @pat-s, @qwerty287
+
+### 🔒 Security
+
+- Chore(deps): update dependency vite to v5.4.6 [security] ([#4163](https://github.com/woodpecker-ci/woodpecker/pull/4163)) [[#4187](https://github.com/woodpecker-ci/woodpecker/pull/4187)]
+
+### 🐛 Bug Fixes
+
+- Don't parse forge config files multiple times if no error occured ([#4272](https://github.com/woodpecker-ci/woodpecker/pull/4272)) [[#4273](https://github.com/woodpecker-ci/woodpecker/pull/4273)]
+- Fix repo/owner parsing for gitlab ([#4255](https://github.com/woodpecker-ci/woodpecker/pull/4255)) [[#4261](https://github.com/woodpecker-ci/woodpecker/pull/4261)]
+- Run queue.process() in background [[#4115](https://github.com/woodpecker-ci/woodpecker/pull/4115)]
+- Only update agent.LastWork if not done recently ([#4031](https://github.com/woodpecker-ci/woodpecker/pull/4031)) [[#4100](https://github.com/woodpecker-ci/woodpecker/pull/4100)]
+
+### Misc
+
+- Backport JS dependency updates [[#4189](https://github.com/woodpecker-ci/woodpecker/pull/4189)]
+
+## [2.7.1](https://github.com/woodpecker-ci/woodpecker/releases/tag/v2.7.1) - 2024-09-07
+
+### ❤️ Thanks to all contributors! ❤️
+
+@6543, @anbraten, @j04n-f, @qwerty287
+
+### 🔒 Security
+
+- Lint privileged plugin match and allow to be set empty [[#4084](https://github.com/woodpecker-ci/woodpecker/pull/4084)]
+- Allow admins to specify privileged plugins by name **and tag** [[#4076](https://github.com/woodpecker-ci/woodpecker/pull/4076)]
+- Warn if using secrets/env with plugin [[#4039](https://github.com/woodpecker-ci/woodpecker/pull/4039)]
+
+### 🐛 Bug Fixes
+
+- Set refspec for gitlab MR [[#4021](https://github.com/woodpecker-ci/woodpecker/pull/4021)]
+- Change Bitbucket PR hook to point the source branch, commit & ref [[#3965](https://github.com/woodpecker-ci/woodpecker/pull/3965)]
+- Add updated, merged and declined events to bb webhook activation [[#3963](https://github.com/woodpecker-ci/woodpecker/pull/3963)]
+- Fix login via navbar [[#3962](https://github.com/woodpecker-ci/woodpecker/pull/3962)]
+- Fix panic if forge is unreachable [[#3944](https://github.com/woodpecker-ci/woodpecker/pull/3944)]
+- Fix org settings page [[#4093](https://github.com/woodpecker-ci/woodpecker/pull/4093)]
+
+### Misc
+
+- Bump github.com/docker/docker from v24.0.9 to v24.0.9+30 [[#4077](https://github.com/woodpecker-ci/woodpecker/pull/4077)]
+
## [2.7.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v2.7.0) - 2024-07-18
### ❤️ Thanks to all contributors! ❤️
diff --git a/Makefile b/Makefile
index 8ab78b0c6..43e87b2b9 100644
--- a/Makefile
+++ b/Makefile
@@ -39,7 +39,8 @@ CGO_ENABLED ?= 1 # only used to compile server
HAS_GO = $(shell hash go > /dev/null 2>&1 && echo "GO" || echo "NOGO" )
ifeq ($(HAS_GO),GO)
- XGO_VERSION ?= go-1.20.x
+ # renovate: datasource=docker depName=docker.io/techknowlogick/xgo
+ XGO_VERSION ?= go-1.22.x
CGO_CFLAGS ?= $(shell go env CGO_CFLAGS)
endif
CGO_CFLAGS ?=
diff --git a/README.md b/README.md
index dec158360..1386dc7c1 100644
--- a/README.md
+++ b/README.md
@@ -43,55 +43,48 @@
-Woodpecker is a simple yet powerful CI/CD engine with great extensibility.
+Woodpecker is a simple, yet powerful CI/CD engine with great extensibility.
-![woodpecker](docs/docs/woodpecker.png)
+![woodpecker](docs/woodpecker.png)
-## 🫶 Support
+## Installation & Resources
-Please consider donating and become a backer. 🙏 [[Become a backer](https://opencollective.com/woodpecker-ci#category-CONTRIBUTE)]
+Woodpecker can be installed in various ways (see the [Installation Instructions](https://woodpecker-ci.org/docs/administration/getting-started)) and runs with SQLite as database by default.
+It requires around 100 MB of RAM (Server) and 30 MB (Agent) at runtime in idle mode.
+
+## Support
+
+You can support the project by becoming a backer on [Open Collective](https://opencollective.com/woodpecker-ci#category-CONTRIBUTE) or via [GitHub Sponsors](https://github.com/sponsors/woodpecker-ci).
-## 📖 Documentation
+## Documentation
-
+Our documentation can be found at .
-## ✨ Contribute
+## Translation
-See [Contributing Guide](https://github.com/woodpecker-ci/.github/blob/main/CONTRIBUTING.md)
+We have a self-hosted [Weblate](https://weblate.org/en/) instance at [translate.woodpecker-ci.org](https://translate.woodpecker-ci.org).
-[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://woodpecker-ci.org/docs/next/development/getting-started#gitpod)
+An overview of the current translation state is available at .
-## 📣 Translate
+## Public Woodpecker Instances
-We use an own [Weblate](https://weblate.org/en/) instance at [translate.woodpecker-ci.org](https://translate.woodpecker-ci.org).
+Woodpecker is used as the main CI/CD engine at [Codeberg](https://codeberg.org), an alternative Git hosting platform with a focus on privacy and free software development.
-
-
-
+## Plugins
-## 👋 Who uses Woodpecker?
+Woodpecker can be extended via plugins.
+The [plugin overview website](https://woodpecker-ci.org/plugins) helps browsing available plugins.
+It combines both plugins by the Woodpecker core team and community-maintained ones.
-Woodpecker is used by [itself](https://ci.woodpecker-ci.org/woodpecker/woodpecker-ci/), multiple well-known companies, organizations like [Codeberg](https://codeberg.org), hobbyists and many others.
+## Star History
-Leave a [comment](https://github.com/woodpecker-ci/woodpecker/discussions/2149) if you're using it as well.
-
-Also consider using the topic `WoodpeckerCI` in your repository, so others can learn from your config and use the hashtag `#WoodpeckerCI` when talking about the project on social media!
-
-Here are some places where people mention Woodpecker:
-
-- [GitHub](https://github.com/topics/WoodpeckerCI)
-- [Codeberg](https://codeberg.org/explore/repos?q=woodpeckerci&topic=1)
-- [Twitter](https://twitter.com/search?q=%23WoodpeckerCI&src=typed_query)
-- [Fediverse](https://mastodon.social/tags/WoodpeckerCI)
-
-## ✨ Stars over time
-
-[![Stargazers over time](https://starchart.cc/woodpecker-ci/woodpecker.svg)](https://starchart.cc/woodpecker-ci/woodpecker)
+[![Star History Chart](https://api.star-history.com/svg?repos=woodpecker-ci/woodpecker&type=Date)](https://star-history.com/#woodpecker-ci/woodpecker&Date)
## License
-Woodpecker is Apache 2.0 licensed with the source files in this repository having a header indicating which license they are under and what copyrights apply.
+Woodpecker is Apache 2.0 licensed.
+The source files have a header indicating which license they are under and what copyrights apply.
-Files under the `docs/` folder are licensed under Creative Commons Attribution-ShareAlike 4.0 International Public License.
+Everything in `docs/` is licensed under the Creative Commons Attribution-ShareAlike 4.0 International Public License.
diff --git a/agent/logger.go b/agent/logger.go
index 7847999a7..7e3469fd6 100644
--- a/agent/logger.go
+++ b/agent/logger.go
@@ -26,19 +26,12 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc"
)
-const (
- // Store not more than 1mb in a log-line as 4mb is the limit of a grpc message
- // and log-lines needs to be parsed by the browsers later on.
- maxLogLineLength = 1024 * 1024 // 1mb
-)
-
func (r *Runner) createLogger(_logger zerolog.Logger, uploads *sync.WaitGroup, workflow *rpc.Workflow) pipeline.Logger {
return func(step *backend.Step, rc io.ReadCloser) error {
defer rc.Close()
logger := _logger.With().
Str("image", step.Image).
- Str("workflow_id", workflow.ID).
Logger()
uploads.Add(1)
@@ -51,7 +44,7 @@ func (r *Runner) createLogger(_logger zerolog.Logger, uploads *sync.WaitGroup, w
logger.Debug().Msg("log stream opened")
logStream := log.NewLineWriter(r.client, step.UUID, secrets...)
- if err := log.CopyLineByLine(logStream, rc, maxLogLineLength); err != nil {
+ if err := log.CopyLineByLine(logStream, rc, pipeline.MaxLogLineLength); err != nil {
logger.Error().Err(err).Msg("copy limited logStream part")
}
diff --git a/agent/rpc/client_grpc.go b/agent/rpc/client_grpc.go
index e1dc0d8ef..74114f8dc 100644
--- a/agent/rpc/client_grpc.go
+++ b/agent/rpc/client_grpc.go
@@ -25,29 +25,44 @@ import (
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
+ grpcproto "google.golang.org/protobuf/proto"
backend "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc/proto"
)
-// Set grpc version on compile time to compare against server version response.
-const ClientGrpcVersion int32 = proto.Version
+const (
+ // Set grpc version on compile time to compare against server version response.
+ ClientGrpcVersion int32 = proto.Version
+
+ // Maximum size of an outgoing log message.
+ // Picked to prevent it from going over GRPC size limit (4 MiB) with a large safety margin.
+ maxLogBatchSize int = 1 * 1024 * 1024
+
+ // Maximum amount of time between sending consecutive batched log messages.
+ // Controls the delay between the CI job generating a log record, and web users receiving it.
+ maxLogFlushPeriod time.Duration = time.Second
+)
type client struct {
client proto.WoodpeckerClient
conn *grpc.ClientConn
+ logs chan *proto.LogEntry
}
// NewGrpcClient returns a new grpc Client.
-func NewGrpcClient(conn *grpc.ClientConn) rpc.Peer {
+func NewGrpcClient(ctx context.Context, conn *grpc.ClientConn) rpc.Peer {
client := new(client)
client.client = proto.NewWoodpeckerClient(conn)
client.conn = conn
+ client.logs = make(chan *proto.LogEntry, 10) // max memory use: 10 lines * 1 MiB
+ go client.processLogs(ctx)
return client
}
func (c *client) Close() error {
+ close(c.logs)
return c.conn.Close()
}
@@ -72,13 +87,13 @@ func (c *client) Version(ctx context.Context) (*rpc.Version, error) {
}
// Next returns the next workflow in the queue.
-func (c *client) Next(ctx context.Context, f rpc.Filter) (*rpc.Workflow, error) {
+func (c *client) Next(ctx context.Context, filter rpc.Filter) (*rpc.Workflow, error) {
var res *proto.NextResponse
var err error
retry := c.newBackOff()
req := new(proto.NextRequest)
req.Filter = new(proto.Filter)
- req.Filter.Labels = f.Labels
+ req.Filter.Labels = filter.Labels
for {
res, err = c.client.Next(ctx, req)
if err == nil {
@@ -135,10 +150,10 @@ func (c *client) Next(ctx context.Context, f rpc.Filter) (*rpc.Workflow, error)
}
// Wait blocks until the workflow is complete.
-func (c *client) Wait(ctx context.Context, id string) (err error) {
+func (c *client) Wait(ctx context.Context, workflowID string) (err error) {
retry := c.newBackOff()
req := new(proto.WaitRequest)
- req.Id = id
+ req.Id = workflowID
for {
_, err = c.client.Wait(ctx, req)
if err == nil {
@@ -273,10 +288,10 @@ func (c *client) Done(ctx context.Context, workflowID string, state rpc.Workflow
}
// Extend extends the workflow deadline.
-func (c *client) Extend(ctx context.Context, id string) (err error) {
+func (c *client) Extend(ctx context.Context, workflowID string) (err error) {
retry := c.newBackOff()
req := new(proto.ExtendRequest)
- req.Id = id
+ req.Id = workflowID
for {
_, err = c.client.Extend(ctx, req)
if err == nil {
@@ -317,10 +332,10 @@ func (c *client) Extend(ctx context.Context, id string) (err error) {
}
// Update updates the workflow state.
-func (c *client) Update(ctx context.Context, id string, state rpc.StepState) (err error) {
+func (c *client) Update(ctx context.Context, workflowID string, state rpc.StepState) (err error) {
retry := c.newBackOff()
req := new(proto.UpdateRequest)
- req.Id = id
+ req.Id = workflowID
req.State = new(proto.StepState)
req.State.StepUuid = state.StepUUID
req.State.Started = state.Started
@@ -367,18 +382,69 @@ func (c *client) Update(ctx context.Context, id string, state rpc.StepState) (er
return nil
}
-// Log writes the workflow log entry.
-func (c *client) Log(ctx context.Context, logEntry *rpc.LogEntry) (err error) {
- retry := c.newBackOff()
- req := new(proto.LogRequest)
- req.LogEntry = new(proto.LogEntry)
- req.LogEntry.StepUuid = logEntry.StepUUID
- req.LogEntry.Data = logEntry.Data
- req.LogEntry.Line = int32(logEntry.Line)
- req.LogEntry.Time = logEntry.Time
- req.LogEntry.Type = int32(logEntry.Type)
+// EnqueueLog queues the log entry to be written in a batch later.
+func (c *client) EnqueueLog(logEntry *rpc.LogEntry) {
+ c.logs <- &proto.LogEntry{
+ StepUuid: logEntry.StepUUID,
+ Data: logEntry.Data,
+ Line: int32(logEntry.Line),
+ Time: logEntry.Time,
+ Type: int32(logEntry.Type),
+ }
+}
+
+func (c *client) processLogs(ctx context.Context) {
+ var entries []*proto.LogEntry
+ var bytes int
+
+ send := func() {
+ if len(entries) == 0 {
+ return
+ }
+
+ log.Debug().
+ Int("entries", len(entries)).
+ Int("bytes", bytes).
+ Msg("log drain: sending queued logs")
+
+ if err := c.sendLogs(ctx, entries); err != nil {
+ log.Error().Err(err).Msg("log drain: could not send logs to server")
+ }
+
+ // even if send failed, we don't have infinite memory; retry has already been used
+ entries = entries[:0]
+ bytes = 0
+ }
+
+ // ctx.Done() is covered by the log channel being closed
for {
- _, err = c.client.Log(ctx, req)
+ select {
+ case entry, ok := <-c.logs:
+ if !ok {
+ log.Info().Msg("log drain: channel closed")
+ send()
+ return
+ }
+
+ entries = append(entries, entry)
+ bytes += grpcproto.Size(entry) // cspell:words grpcproto
+
+ if bytes >= maxLogBatchSize {
+ send()
+ }
+
+ case <-time.After(maxLogFlushPeriod):
+ send()
+ }
+ }
+}
+
+func (c *client) sendLogs(ctx context.Context, entries []*proto.LogEntry) error {
+ req := &proto.LogRequest{LogEntries: entries}
+ retry := c.newBackOff()
+
+ for {
+ _, err := c.client.Log(ctx, req)
if err == nil {
break
}
@@ -414,12 +480,15 @@ func (c *client) Log(ctx context.Context, logEntry *rpc.LogEntry) (err error) {
return nil
}
-func (c *client) RegisterAgent(ctx context.Context, platform, backend, version string, capacity int) (int64, error) {
+func (c *client) RegisterAgent(ctx context.Context, info rpc.AgentInfo) (int64, error) {
req := new(proto.RegisterAgentRequest)
- req.Platform = platform
- req.Backend = backend
- req.Version = version
- req.Capacity = int32(capacity)
+ req.Info = &proto.AgentInfo{
+ Platform: info.Platform,
+ Backend: info.Backend,
+ Version: info.Version,
+ Capacity: int32(info.Capacity),
+ CustomLabels: info.CustomLabels,
+ }
res, err := c.client.RegisterAgent(ctx, req)
return res.GetAgentId(), err
diff --git a/agent/runner.go b/agent/runner.go
index ea3016e36..27363aa66 100644
--- a/agent/runner.go
+++ b/agent/runner.go
@@ -28,6 +28,7 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/pipeline"
backend "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc"
+ "go.woodpecker-ci.org/woodpecker/v2/shared/constant"
"go.woodpecker-ci.org/woodpecker/v2/shared/utils"
)
@@ -105,7 +106,6 @@ func (r *Runner) Run(runnerCtx, shutdownCtx context.Context) error { //nolint:co
if err := r.client.Wait(workflowCtx, workflow.ID); err != nil {
canceled = true
logger.Warn().Err(err).Msg("cancel signal received")
-
cancel()
} else {
logger.Debug().Msg("done listening for cancel signal")
@@ -117,11 +117,10 @@ func (r *Runner) Run(runnerCtx, shutdownCtx context.Context) error { //nolint:co
select {
case <-workflowCtx.Done():
logger.Debug().Msg("pipeline done")
-
return
- case <-time.After(time.Minute):
- logger.Debug().Msg("pipeline lease renewed")
+ case <-time.After(constant.TaskTimeout / 3):
+ logger.Debug().Msg("pipeline lease renewed")
if err := r.client.Extend(workflowCtx, workflow.ID); err != nil {
log.Error().Err(err).Msg("extending pipeline deadline failed")
}
@@ -144,7 +143,7 @@ func (r *Runner) Run(runnerCtx, shutdownCtx context.Context) error { //nolint:co
pipeline.WithContext(workflowCtx),
pipeline.WithTaskUUID(fmt.Sprint(workflow.ID)),
pipeline.WithLogger(r.createLogger(logger, &uploads, workflow)),
- pipeline.WithTracer(r.createTracer(ctxMeta, logger, workflow)),
+ pipeline.WithTracer(r.createTracer(ctxMeta, &uploads, logger, workflow)),
pipeline.WithBackend(*r.backend),
pipeline.WithDescription(map[string]string{
"workflow_id": workflow.ID,
@@ -170,9 +169,9 @@ func (r *Runner) Run(runnerCtx, shutdownCtx context.Context) error { //nolint:co
Bool("canceled", canceled).
Msg("workflow finished")
- logger.Debug().Msg("uploading logs ...")
+ logger.Debug().Msg("uploading logs and traces / states ...")
uploads.Wait()
- logger.Debug().Msg("uploaded logs")
+ logger.Debug().Msg("uploaded logs and traces / states")
logger.Debug().
Str("error", state.Error).
diff --git a/agent/tracer.go b/agent/tracer.go
index 9f3588126..ff8f23c38 100644
--- a/agent/tracer.go
+++ b/agent/tracer.go
@@ -18,6 +18,7 @@ import (
"context"
"runtime"
"strconv"
+ "sync"
"time"
"github.com/rs/zerolog"
@@ -26,11 +27,13 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc"
)
-func (r *Runner) createTracer(ctxMeta context.Context, logger zerolog.Logger, workflow *rpc.Workflow) pipeline.TraceFunc {
+func (r *Runner) createTracer(ctxMeta context.Context, uploads *sync.WaitGroup, logger zerolog.Logger, workflow *rpc.Workflow) pipeline.TraceFunc {
return func(state *pipeline.State) error {
+ uploads.Add(1)
+
stepLogger := logger.With().
Str("image", state.Pipeline.Step.Image).
- Str("workflowID", workflow.ID).
+ Str("workflow_id", workflow.ID).
Err(state.Process.Error).
Int("exit_code", state.Process.ExitCode).
Bool("exited", state.Process.Exited).
@@ -57,6 +60,7 @@ func (r *Runner) createTracer(ctxMeta context.Context, logger zerolog.Logger, wo
}
stepLogger.Debug().Msg("update step status complete")
+ uploads.Done()
}()
if state.Process.Exited {
return nil
@@ -68,21 +72,12 @@ func (r *Runner) createTracer(ctxMeta context.Context, logger zerolog.Logger, wo
// TODO: find better way to update this state and move it to pipeline to have the same env in cli-exec
state.Pipeline.Step.Environment["CI_MACHINE"] = r.hostname
- state.Pipeline.Step.Environment["CI_PIPELINE_STATUS"] = "success"
state.Pipeline.Step.Environment["CI_PIPELINE_STARTED"] = strconv.FormatInt(state.Pipeline.Started, 10)
- state.Pipeline.Step.Environment["CI_PIPELINE_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10)
- state.Pipeline.Step.Environment["CI_STEP_STATUS"] = "success"
state.Pipeline.Step.Environment["CI_STEP_STARTED"] = strconv.FormatInt(state.Pipeline.Started, 10)
- state.Pipeline.Step.Environment["CI_STEP_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10)
state.Pipeline.Step.Environment["CI_SYSTEM_PLATFORM"] = runtime.GOOS + "/" + runtime.GOARCH
- if state.Pipeline.Error != nil {
- state.Pipeline.Step.Environment["CI_PIPELINE_STATUS"] = "failure"
- state.Pipeline.Step.Environment["CI_STEP_STATUS"] = "failure"
- }
-
return nil
}
}
diff --git a/cli/exec/exec.go b/cli/exec/exec.go
index 4a28c6781..8bcf95ba8 100644
--- a/cli/exec/exec.go
+++ b/cli/exec/exec.go
@@ -25,6 +25,7 @@ import (
"strings"
"github.com/drone/envsubst"
+ "github.com/oklog/ulid/v2"
"github.com/rs/zerolog/log"
"github.com/urfave/cli/v3"
@@ -37,11 +38,13 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/local"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/lxc"
backend_types "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types"
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/metadata"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/compiler"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/linter"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/matrix"
pipelineLog "go.woodpecker-ci.org/woodpecker/v2/pipeline/log"
+ "go.woodpecker-ci.org/woodpecker/v2/shared/constant"
"go.woodpecker-ci.org/woodpecker/v2/shared/utils"
)
@@ -76,6 +79,7 @@ func execDir(ctx context.Context, c *cli.Command, dir string) error {
if runtime.GOOS == "windows" {
repoPath = convertPathForWindows(repoPath)
}
+ // TODO: respect depends_on and do parallel runs with output to multiple _windows_ e.g. tmux like
return filepath.Walk(dir, func(path string, info os.FileInfo, e error) error {
if e != nil {
return e
@@ -84,7 +88,7 @@ func execDir(ctx context.Context, c *cli.Command, dir string) error {
// check if it is a regular file (not dir)
if info.Mode().IsRegular() && (strings.HasSuffix(info.Name(), ".yaml") || strings.HasSuffix(info.Name(), ".yml")) {
fmt.Println("#", info.Name())
- _ = runExec(ctx, c, path, repoPath) // TODO: should we drop errors or store them and report back?
+ _ = runExec(ctx, c, path, repoPath, false) // TODO: should we drop errors or store them and report back?
fmt.Println("")
return nil
}
@@ -103,10 +107,10 @@ func execFile(ctx context.Context, c *cli.Command, file string) error {
if runtime.GOOS == "windows" {
repoPath = convertPathForWindows(repoPath)
}
- return runExec(ctx, c, file, repoPath)
+ return runExec(ctx, c, file, repoPath, true)
}
-func runExec(ctx context.Context, c *cli.Command, file, repoPath string) error {
+func runExec(ctx context.Context, c *cli.Command, file, repoPath string, singleExec bool) error {
dat, err := os.ReadFile(file)
if err != nil {
return err
@@ -121,7 +125,7 @@ func runExec(ctx context.Context, c *cli.Command, file, repoPath string) error {
axes = append(axes, matrix.Axis{})
}
for _, axis := range axes {
- err := execWithAxis(ctx, c, file, repoPath, axis)
+ err := execWithAxis(ctx, c, file, repoPath, axis, singleExec)
if err != nil {
return err
}
@@ -129,8 +133,20 @@ func runExec(ctx context.Context, c *cli.Command, file, repoPath string) error {
return nil
}
-func execWithAxis(ctx context.Context, c *cli.Command, file, repoPath string, axis matrix.Axis) error {
- metadata := metadataFromContext(ctx, c, axis)
+func execWithAxis(ctx context.Context, c *cli.Command, file, repoPath string, axis matrix.Axis, singleExec bool) error {
+ metadataWorkflow := &metadata.Workflow{}
+ if !singleExec {
+ // TODO: proper try to use the engine to generate the same metadata for workflows
+ // https://github.com/woodpecker-ci/woodpecker/pull/3967
+ metadataWorkflow.Name = strings.TrimSuffix(strings.TrimSuffix(file, ".yaml"), ".yml")
+ }
+ metadata, err := metadataFromContext(ctx, c, axis, metadataWorkflow)
+ if err != nil {
+ return fmt.Errorf("could not create metadata: %w", err)
+ } else if metadata == nil {
+ return fmt.Errorf("metadata is nil")
+ }
+
environ := metadata.Environ()
var secrets []compiler.Secret
for key, val := range metadata.Workflow.Matrix {
@@ -168,6 +184,9 @@ func execWithAxis(ctx context.Context, c *cli.Command, file, repoPath string, ax
return err
}
+ // emulate server behavior https://github.com/woodpecker-ci/woodpecker/blob/eebaa10d104cbc3fa7ce4c0e344b0b7978405135/server/pipeline/stepbuilder/stepBuilder.go#L289-L295
+ prefix := "wp_" + ulid.Make().String()
+
// configure volumes for local execution
volumes := c.StringSlice("volumes")
if c.Bool("local") {
@@ -182,12 +201,22 @@ func execWithAxis(ctx context.Context, c *cli.Command, file, repoPath string, ax
workspacePath = c.String("workspace-path")
}
- volumes = append(volumes, c.String("prefix")+"_default:"+workspaceBase)
+ volumes = append(volumes, prefix+"_default:"+workspaceBase)
volumes = append(volumes, repoPath+":"+path.Join(workspaceBase, workspacePath))
}
+ privilegedPlugins := c.StringSlice("plugins-privileged")
+
// lint the yaml file
- err = linter.New(linter.WithTrusted(true)).Lint([]*linter.WorkflowConfig{{
+ err = linter.New(
+ linter.WithTrusted(linter.TrustedConfiguration{
+ Security: c.Bool("repo-trusted-security"),
+ Network: c.Bool("repo-trusted-network"),
+ Volumes: c.Bool("repo-trusted-volumes"),
+ }),
+ linter.PrivilegedPlugins(privilegedPlugins),
+ linter.WithTrustedClonePlugins(constant.TrustedClonePlugins),
+ ).Lint([]*linter.WorkflowConfig{{
File: path.Base(file),
RawConfig: confStr,
Workflow: conf,
@@ -203,7 +232,7 @@ func execWithAxis(ctx context.Context, c *cli.Command, file, repoPath string, ax
// compiles the yaml file
compiled, err := compiler.New(
compiler.WithEscalated(
- c.StringSlice("privileged")...,
+ privilegedPlugins...,
),
compiler.WithVolumes(volumes...),
compiler.WithWorkspace(
@@ -213,9 +242,7 @@ func execWithAxis(ctx context.Context, c *cli.Command, file, repoPath string, ax
compiler.WithNetworks(
c.StringSlice("network")...,
),
- compiler.WithPrefix(
- c.String("prefix"),
- ),
+ compiler.WithPrefix(prefix),
compiler.WithProxy(compiler.ProxyOptions{
NoProxy: c.String("backend-no-proxy"),
HTTPProxy: c.String("backend-http-proxy"),
@@ -229,7 +256,7 @@ func execWithAxis(ctx context.Context, c *cli.Command, file, repoPath string, ax
c.String("netrc-password"),
c.String("netrc-machine"),
),
- compiler.WithMetadata(metadata),
+ compiler.WithMetadata(*metadata),
compiler.WithSecret(secrets...),
compiler.WithEnviron(pipelineEnv),
).Compile(conf)
@@ -283,8 +310,7 @@ func convertPathForWindows(path string) string {
return filepath.ToSlash(path)
}
-const maxLogLineLength = 1024 * 1024 // 1mb
var defaultLogger = pipeline.Logger(func(step *backend_types.Step, rc io.ReadCloser) error {
logWriter := NewLineWriter(step.Name, step.UUID)
- return pipelineLog.CopyLineByLine(logWriter, rc, maxLogLineLength)
+ return pipelineLog.CopyLineByLine(logWriter, rc, pipeline.MaxLogLineLength)
})
diff --git a/cli/exec/flags.go b/cli/exec/flags.go
index 3b0c5d295..d50376bdb 100644
--- a/cli/exec/flags.go
+++ b/cli/exec/flags.go
@@ -18,8 +18,6 @@ import (
"time"
"github.com/urfave/cli/v3"
-
- "go.woodpecker-ci.org/woodpecker/v2/shared/constant"
)
var flags = []cli.Flag{
@@ -34,6 +32,11 @@ var flags = []cli.Flag{
Name: "repo-path",
Usage: "path to local repository",
},
+ &cli.StringFlag{
+ Sources: cli.EnvVars("WOODPECKER_METADATA_FILE"),
+ Name: "metadata-file",
+ Usage: "path to pipeline metadata file (normally downloaded from UI). Parameters can be adjusted by applying additional cli flags",
+ },
&cli.DurationFlag{
Sources: cli.EnvVars("WOODPECKER_TIMEOUT"),
Name: "timeout",
@@ -50,17 +53,10 @@ var flags = []cli.Flag{
Name: "network",
Usage: "external networks",
},
- &cli.StringFlag{
- Sources: cli.EnvVars("WOODPECKER_PREFIX"),
- Name: "prefix",
- Value: "woodpecker",
- Usage: "prefix used for containers, volumes, networks, ... created by woodpecker",
- Hidden: true,
- },
&cli.StringSliceFlag{
- Name: "privileged",
- Usage: "privileged plugins",
- Value: constant.PrivilegedPlugins,
+ Sources: cli.EnvVars("WOODPECKER_PLUGINS_PRIVILEGED"),
+ Name: "plugins-privileged",
+ Usage: "Allow plugins to run in privileged mode, if environment variable is defined but empty there will be none",
},
&cli.StringFlag{
Sources: cli.EnvVars("WOODPECKER_BACKEND"),
@@ -127,201 +123,287 @@ var flags = []cli.Flag{
&cli.StringFlag{
Sources: cli.EnvVars("CI_SYSTEM_PLATFORM"),
Name: "system-platform",
+ Usage: "Set the metadata environment variable \"CI_SYSTEM_PLATFORM\".",
+ },
+ &cli.StringFlag{
+ Sources: cli.EnvVars("CI_SYSTEM_HOST"),
+ Name: "system-host",
+ Usage: "Set the metadata environment variable \"CI_SYSTEM_HOST\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_SYSTEM_NAME"),
Name: "system-name",
+ Usage: "Set the metadata environment variable \"CI_SYSTEM_NAME\".",
Value: "woodpecker",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_SYSTEM_URL"),
Name: "system-url",
+ Usage: "Set the metadata environment variable \"CI_SYSTEM_URL\".",
Value: "https://github.com/woodpecker-ci/woodpecker",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_REPO"),
Name: "repo",
- Usage: "full repo name",
+ Usage: "Set the full name to derive metadata environment variables \"CI_REPO\", \"CI_REPO_NAME\" and \"CI_REPO_OWNER\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_REPO_REMOTE_ID"),
Name: "repo-remote-id",
+ Usage: "Set the metadata environment variable \"CI_REPO_REMOTE_ID\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_REPO_URL"),
Name: "repo-url",
+ Usage: "Set the metadata environment variable \"CI_REPO_URL\".",
+ },
+ &cli.StringFlag{
+ Sources: cli.EnvVars("CI_REPO_SCM"),
+ Name: "repo-scm",
+ Usage: "Set the metadata environment variable \"CI_REPO_SCM\".",
+ Value: "git",
+ },
+ &cli.StringFlag{
+ Sources: cli.EnvVars("CI_REPO_DEFAULT_BRANCH"),
+ Name: "repo-default-branch",
+ Usage: "Set the metadata environment variable \"CI_REPO_DEFAULT_BRANCH\".",
+ Value: "main",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_REPO_CLONE_URL"),
Name: "repo-clone-url",
+ Usage: "Set the metadata environment variable \"CI_REPO_CLONE_URL\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_REPO_CLONE_SSH_URL"),
Name: "repo-clone-ssh-url",
+ Usage: "Set the metadata environment variable \"CI_REPO_CLONE_SSH_URL\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_REPO_PRIVATE"),
Name: "repo-private",
+ Usage: "Set the metadata environment variable \"CI_REPO_PRIVATE\".",
},
&cli.BoolFlag{
- Sources: cli.EnvVars("CI_REPO_TRUSTED"),
- Name: "repo-trusted",
+ Sources: cli.EnvVars("CI_REPO_TRUSTED_NETWORK"),
+ Name: "repo-trusted-network",
+ Usage: "Set the metadata environment variable \"CI_REPO_TRUSTED_NETWORK\".",
+ },
+ &cli.BoolFlag{
+ Sources: cli.EnvVars("CI_REPO_TRUSTED_VOLUMES"),
+ Name: "repo-trusted-volumes",
+ Usage: "Set the metadata environment variable \"CI_REPO_TRUSTED_VOLUMES\".",
+ },
+ &cli.BoolFlag{
+ Sources: cli.EnvVars("CI_REPO_TRUSTED_SECURITY"),
+ Name: "repo-trusted-security",
+ Usage: "Set the metadata environment variable \"CI_REPO_TRUSTED_SECURITY\".",
},
&cli.IntFlag{
Sources: cli.EnvVars("CI_PIPELINE_NUMBER"),
Name: "pipeline-number",
+ Usage: "Set the metadata environment variable \"CI_PIPELINE_NUMBER\".",
},
&cli.IntFlag{
Sources: cli.EnvVars("CI_PIPELINE_PARENT"),
Name: "pipeline-parent",
+ Usage: "Set the metadata environment variable \"CI_PIPELINE_PARENT\".",
},
&cli.IntFlag{
Sources: cli.EnvVars("CI_PIPELINE_CREATED"),
Name: "pipeline-created",
+ Usage: "Set the metadata environment variable \"CI_PIPELINE_CREATED\".",
},
&cli.IntFlag{
Sources: cli.EnvVars("CI_PIPELINE_STARTED"),
Name: "pipeline-started",
- },
- &cli.IntFlag{
- Sources: cli.EnvVars("CI_PIPELINE_FINISHED"),
- Name: "pipeline-finished",
- },
- &cli.StringFlag{
- Sources: cli.EnvVars("CI_PIPELINE_STATUS"),
- Name: "pipeline-status",
+ Usage: "Set the metadata environment variable \"CI_PIPELINE_STARTED\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PIPELINE_EVENT"),
Name: "pipeline-event",
+ Usage: "Set the metadata environment variable \"CI_PIPELINE_EVENT\".",
Value: "manual",
},
&cli.StringFlag{
- Sources: cli.EnvVars("CI_PIPELINE_URL"),
+ Sources: cli.EnvVars("CI_PIPELINE_FORGE_URL"),
Name: "pipeline-url",
+ Usage: "Set the metadata environment variable \"CI_PIPELINE_FORGE_URL\".",
},
&cli.StringFlag{
- Sources: cli.EnvVars("CI_PIPELINE_DEPLOY_TARGET", "CI_PIPELINE_TARGET"), // TODO: remove CI_PIPELINE_TARGET in 3.x
+ Sources: cli.EnvVars("CI_PIPELINE_DEPLOY_TARGET"),
Name: "pipeline-deploy-to",
+ Usage: "Set the metadata environment variable \"CI_PIPELINE_DEPLOY_TARGET\".",
},
&cli.StringFlag{
- Sources: cli.EnvVars("CI_PIPELINE_DEPLOY_TASK", "CI_PIPELINE_TASK"), // TODO: remove CI_PIPELINE_TASK in 3.x
+ Sources: cli.EnvVars("CI_PIPELINE_DEPLOY_TASK"),
Name: "pipeline-deploy-task",
+ Usage: "Set the metadata environment variable \"CI_PIPELINE_DEPLOY_TASK\".",
+ },
+ &cli.StringFlag{
+ Sources: cli.EnvVars("CI_PIPELINE_FILES"),
+ Usage: "Set the metadata environment variable \"CI_PIPELINE_FILES\", either json formatted list of strings, or comma separated string list.",
+ Name: "pipeline-changed-files",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_COMMIT_SHA"),
Name: "commit-sha",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_SHA\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_COMMIT_REF"),
Name: "commit-ref",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_REF\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_COMMIT_REFSPEC"),
Name: "commit-refspec",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_REFSPEC\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_COMMIT_BRANCH"),
Name: "commit-branch",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_BRANCH\".",
+ Value: "main",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_COMMIT_MESSAGE"),
Name: "commit-message",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_MESSAGE\".",
},
&cli.StringFlag{
- Sources: cli.EnvVars("CI_COMMIT_AUTHOR_NAME"),
+ Sources: cli.EnvVars("CI_COMMIT_AUTHOR"),
Name: "commit-author-name",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_AUTHOR\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_COMMIT_AUTHOR_AVATAR"),
Name: "commit-author-avatar",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_AUTHOR_AVATAR\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_COMMIT_AUTHOR_EMAIL"),
Name: "commit-author-email",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_AUTHOR_EMAIL\".",
+ },
+ &cli.StringSliceFlag{
+ Sources: cli.EnvVars("CI_COMMIT_PULL_REQUEST_LABELS"),
+ Name: "commit-pull-labels",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_PULL_REQUEST_LABELS\".",
+ },
+ &cli.BoolFlag{
+ Sources: cli.EnvVars("CI_COMMIT_PRERELEASE"),
+ Name: "commit-release-is-pre",
+ Usage: "Set the metadata environment variable \"CI_COMMIT_PRERELEASE\".",
},
&cli.IntFlag{
Sources: cli.EnvVars("CI_PREV_PIPELINE_NUMBER"),
Name: "prev-pipeline-number",
+ Usage: "Set the metadata environment variable \"CI_PREV_PIPELINE_NUMBER\".",
},
&cli.IntFlag{
Sources: cli.EnvVars("CI_PREV_PIPELINE_CREATED"),
Name: "prev-pipeline-created",
+ Usage: "Set the metadata environment variable \"CI_PREV_PIPELINE_CREATED\".",
},
&cli.IntFlag{
Sources: cli.EnvVars("CI_PREV_PIPELINE_STARTED"),
Name: "prev-pipeline-started",
+ Usage: "Set the metadata environment variable \"CI_PREV_PIPELINE_STARTED\".",
},
&cli.IntFlag{
Sources: cli.EnvVars("CI_PREV_PIPELINE_FINISHED"),
Name: "prev-pipeline-finished",
+ Usage: "Set the metadata environment variable \"CI_PREV_PIPELINE_FINISHED\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_PIPELINE_STATUS"),
Name: "prev-pipeline-status",
+ Usage: "Set the metadata environment variable \"CI_PREV_PIPELINE_STATUS\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_PIPELINE_EVENT"),
Name: "prev-pipeline-event",
+ Usage: "Set the metadata environment variable \"CI_PREV_PIPELINE_EVENT\".",
},
&cli.StringFlag{
- Sources: cli.EnvVars("CI_PREV_PIPELINE_URL"),
+ Sources: cli.EnvVars("CI_PREV_PIPELINE_FORGE_URL"),
Name: "prev-pipeline-url",
+ Usage: "Set the metadata environment variable \"CI_PREV_PIPELINE_FORGE_URL\".",
+ },
+ &cli.StringFlag{
+ Sources: cli.EnvVars("CI_PREV_PIPELINE_DEPLOY_TARGET"),
+ Name: "prev-pipeline-deploy-to",
+ Usage: "Set the metadata environment variable \"CI_PREV_PIPELINE_DEPLOY_TARGET\".",
+ },
+ &cli.StringFlag{
+ Sources: cli.EnvVars("CI_PREV_PIPELINE_DEPLOY_TASK"),
+ Name: "prev-pipeline-deploy-task",
+ Usage: "Set the metadata environment variable \"CI_PREV_PIPELINE_DEPLOY_TASK\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_COMMIT_SHA"),
Name: "prev-commit-sha",
+ Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_SHA\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_COMMIT_REF"),
Name: "prev-commit-ref",
+ Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_REF\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_COMMIT_REFSPEC"),
Name: "prev-commit-refspec",
+ Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_REFSPEC\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_COMMIT_BRANCH"),
Name: "prev-commit-branch",
+ Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_BRANCH\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_COMMIT_MESSAGE"),
Name: "prev-commit-message",
+ Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_MESSAGE\".",
},
&cli.StringFlag{
- Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR_NAME"),
+ Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR"),
Name: "prev-commit-author-name",
+ Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_AUTHOR\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR_AVATAR"),
Name: "prev-commit-author-avatar",
+ Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_AUTHOR_AVATAR\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR_EMAIL"),
Name: "prev-commit-author-email",
+ Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_AUTHOR_EMAIL\".",
},
- &cli.IntFlag{
+ &cli.StringFlag{
Sources: cli.EnvVars("CI_WORKFLOW_NAME"),
Name: "workflow-name",
+ Usage: "Set the metadata environment variable \"CI_WORKFLOW_NAME\".",
},
&cli.IntFlag{
Sources: cli.EnvVars("CI_WORKFLOW_NUMBER"),
Name: "workflow-number",
- },
- &cli.IntFlag{
- Sources: cli.EnvVars("CI_STEP_NAME"),
- Name: "step-name",
+ Usage: "Set the metadata environment variable \"CI_WORKFLOW_NUMBER\".",
},
&cli.StringSliceFlag{
Sources: cli.EnvVars("CI_ENV"),
Name: "env",
+ Usage: "Set the metadata environment variable \"CI_ENV\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_FORGE_TYPE"),
Name: "forge-type",
+ Usage: "Set the metadata environment variable \"CI_FORGE_TYPE\".",
},
&cli.StringFlag{
Sources: cli.EnvVars("CI_FORGE_URL"),
Name: "forge-url",
+ Usage: "Set the metadata environment variable \"CI_FORGE_URL\".",
},
}
diff --git a/cli/exec/metadata.go b/cli/exec/metadata.go
index 20a89da66..799e843a4 100644
--- a/cli/exec/metadata.go
+++ b/cli/exec/metadata.go
@@ -16,6 +16,9 @@ package exec
import (
"context"
+ "encoding/json"
+ "fmt"
+ "os"
"runtime"
"strings"
@@ -27,94 +30,133 @@ import (
)
// return the metadata from the cli context.
-func metadataFromContext(_ context.Context, c *cli.Command, axis matrix.Axis) metadata.Metadata {
+func metadataFromContext(_ context.Context, c *cli.Command, axis matrix.Axis, w *metadata.Workflow) (*metadata.Metadata, error) {
+ m := &metadata.Metadata{}
+
+ if c.IsSet("metadata-file") {
+ metadataFile, err := os.Open(c.String("metadata-file"))
+ if err != nil {
+ return nil, err
+ }
+ defer metadataFile.Close()
+
+ if err := json.NewDecoder(metadataFile).Decode(m); err != nil {
+ return nil, err
+ }
+ }
+
platform := c.String("system-platform")
if platform == "" {
platform = runtime.GOOS + "/" + runtime.GOARCH
}
- fullRepoName := c.String("repo-name")
- repoOwner := ""
- repoName := ""
- if idx := strings.LastIndex(fullRepoName, "/"); idx != -1 {
- repoOwner = fullRepoName[:idx]
- repoName = fullRepoName[idx+1:]
+ metadataFileAndOverrideOrDefault(c, "repo-name", func(fullRepoName string) {
+ if idx := strings.LastIndex(fullRepoName, "/"); idx != -1 {
+ m.Repo.Owner = fullRepoName[:idx]
+ m.Repo.Name = fullRepoName[idx+1:]
+ }
+ }, c.String)
+
+ var err error
+ metadataFileAndOverrideOrDefault(c, "pipeline-changed-files", func(changedFilesRaw string) {
+ var changedFiles []string
+ if len(changedFilesRaw) != 0 && changedFilesRaw[0] == '[' {
+ if jsonErr := json.Unmarshal([]byte(changedFilesRaw), &changedFiles); jsonErr != nil {
+ err = fmt.Errorf("pipeline-changed-files detected json but could not parse it: %w", jsonErr)
+ }
+ } else {
+ for _, file := range strings.Split(changedFilesRaw, ",") {
+ changedFiles = append(changedFiles, strings.TrimSpace(file))
+ }
+ }
+ m.Curr.Commit.ChangedFiles = changedFiles
+ }, c.String)
+ if err != nil {
+ return nil, err
}
- return metadata.Metadata{
- Repo: metadata.Repo{
- Name: repoName,
- Owner: repoOwner,
- RemoteID: c.String("repo-remote-id"),
- ForgeURL: c.String("repo-url"),
- CloneURL: c.String("repo-clone-url"),
- CloneSSHURL: c.String("repo-clone-ssh-url"),
- Private: c.Bool("repo-private"),
- Trusted: c.Bool("repo-trusted"),
- },
- Curr: metadata.Pipeline{
- Number: c.Int("pipeline-number"),
- Parent: c.Int("pipeline-parent"),
- Created: c.Int("pipeline-created"),
- Started: c.Int("pipeline-started"),
- Finished: c.Int("pipeline-finished"),
- Status: c.String("pipeline-status"),
- Event: c.String("pipeline-event"),
- ForgeURL: c.String("pipeline-url"),
- DeployTo: c.String("pipeline-deploy-to"),
- DeployTask: c.String("pipeline-deploy-task"),
- Commit: metadata.Commit{
- Sha: c.String("commit-sha"),
- Ref: c.String("commit-ref"),
- Refspec: c.String("commit-refspec"),
- Branch: c.String("commit-branch"),
- Message: c.String("commit-message"),
- Author: metadata.Author{
- Name: c.String("commit-author-name"),
- Email: c.String("commit-author-email"),
- Avatar: c.String("commit-author-avatar"),
- },
- },
- },
- Prev: metadata.Pipeline{
- Number: c.Int("prev-pipeline-number"),
- Created: c.Int("prev-pipeline-created"),
- Started: c.Int("prev-pipeline-started"),
- Finished: c.Int("prev-pipeline-finished"),
- Status: c.String("prev-pipeline-status"),
- Event: c.String("prev-pipeline-event"),
- ForgeURL: c.String("prev-pipeline-url"),
- Commit: metadata.Commit{
- Sha: c.String("prev-commit-sha"),
- Ref: c.String("prev-commit-ref"),
- Refspec: c.String("prev-commit-refspec"),
- Branch: c.String("prev-commit-branch"),
- Message: c.String("prev-commit-message"),
- Author: metadata.Author{
- Name: c.String("prev-commit-author-name"),
- Email: c.String("prev-commit-author-email"),
- Avatar: c.String("prev-commit-author-avatar"),
- },
- },
- },
- Workflow: metadata.Workflow{
- Name: c.String("workflow-name"),
- Number: int(c.Int("workflow-number")),
- Matrix: axis,
- },
- Step: metadata.Step{
- Name: c.String("step-name"),
- Number: int(c.Int("step-number")),
- },
- Sys: metadata.System{
- Name: c.String("system-name"),
- URL: c.String("system-url"),
- Platform: platform,
- Version: version.Version,
- },
- Forge: metadata.Forge{
- Type: c.String("forge-type"),
- URL: c.String("forge-url"),
- },
+ // Repo
+ metadataFileAndOverrideOrDefault(c, "repo-remote-id", func(s string) { m.Repo.RemoteID = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "repo-url", func(s string) { m.Repo.ForgeURL = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "repo-scm", func(s string) { m.Repo.SCM = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "repo-default-branch", func(s string) { m.Repo.Branch = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "repo-clone-url", func(s string) { m.Repo.CloneURL = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "repo-clone-ssh-url", func(s string) { m.Repo.CloneSSHURL = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "repo-private", func(b bool) { m.Repo.Private = b }, c.Bool)
+ metadataFileAndOverrideOrDefault(c, "repo-trusted-network", func(b bool) { m.Repo.Trusted.Network = b }, c.Bool)
+ metadataFileAndOverrideOrDefault(c, "repo-trusted-security", func(b bool) { m.Repo.Trusted.Security = b }, c.Bool)
+ metadataFileAndOverrideOrDefault(c, "repo-trusted-volumes", func(b bool) { m.Repo.Trusted.Volumes = b }, c.Bool)
+
+ // Current Pipeline
+ metadataFileAndOverrideOrDefault(c, "pipeline-number", func(i int64) { m.Curr.Number = i }, c.Int)
+ metadataFileAndOverrideOrDefault(c, "pipeline-parent", func(i int64) { m.Curr.Parent = i }, c.Int)
+ metadataFileAndOverrideOrDefault(c, "pipeline-created", func(i int64) { m.Curr.Created = i }, c.Int)
+ metadataFileAndOverrideOrDefault(c, "pipeline-started", func(i int64) { m.Curr.Started = i }, c.Int)
+ metadataFileAndOverrideOrDefault(c, "pipeline-finished", func(i int64) { m.Curr.Finished = i }, c.Int)
+ metadataFileAndOverrideOrDefault(c, "pipeline-status", func(s string) { m.Curr.Status = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "pipeline-event", func(s string) { m.Curr.Event = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "pipeline-url", func(s string) { m.Curr.ForgeURL = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "pipeline-deploy-to", func(s string) { m.Curr.DeployTo = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "pipeline-deploy-task", func(s string) { m.Curr.DeployTask = s }, c.String)
+
+ // Current Pipeline Commit
+ metadataFileAndOverrideOrDefault(c, "commit-sha", func(s string) { m.Curr.Commit.Sha = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "commit-ref", func(s string) { m.Curr.Commit.Ref = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "commit-refspec", func(s string) { m.Curr.Commit.Refspec = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "commit-branch", func(s string) { m.Curr.Commit.Branch = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "commit-message", func(s string) { m.Curr.Commit.Message = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "commit-author-name", func(s string) { m.Curr.Commit.Author.Name = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "commit-author-email", func(s string) { m.Curr.Commit.Author.Email = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "commit-author-avatar", func(s string) { m.Curr.Commit.Author.Avatar = s }, c.String)
+
+ metadataFileAndOverrideOrDefault(c, "commit-pull-labels", func(sl []string) { m.Curr.Commit.PullRequestLabels = sl }, c.StringSlice)
+ metadataFileAndOverrideOrDefault(c, "commit-release-is-pre", func(b bool) { m.Curr.Commit.IsPrerelease = b }, c.Bool)
+
+ // Previous Pipeline
+ metadataFileAndOverrideOrDefault(c, "prev-pipeline-number", func(i int64) { m.Prev.Number = i }, c.Int)
+ metadataFileAndOverrideOrDefault(c, "prev-pipeline-created", func(i int64) { m.Prev.Created = i }, c.Int)
+ metadataFileAndOverrideOrDefault(c, "prev-pipeline-started", func(i int64) { m.Prev.Started = i }, c.Int)
+ metadataFileAndOverrideOrDefault(c, "prev-pipeline-finished", func(i int64) { m.Prev.Finished = i }, c.Int)
+ metadataFileAndOverrideOrDefault(c, "prev-pipeline-status", func(s string) { m.Prev.Status = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "prev-pipeline-event", func(s string) { m.Prev.Event = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "prev-pipeline-url", func(s string) { m.Prev.ForgeURL = s }, c.String)
+
+ // Previous Pipeline Commit
+ metadataFileAndOverrideOrDefault(c, "prev-commit-sha", func(s string) { m.Prev.Commit.Sha = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "prev-commit-ref", func(s string) { m.Prev.Commit.Ref = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "prev-commit-refspec", func(s string) { m.Prev.Commit.Refspec = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "prev-commit-branch", func(s string) { m.Prev.Commit.Branch = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "prev-commit-message", func(s string) { m.Prev.Commit.Message = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "prev-commit-author-name", func(s string) { m.Prev.Commit.Author.Name = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "prev-commit-author-email", func(s string) { m.Prev.Commit.Author.Email = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "prev-commit-author-avatar", func(s string) { m.Prev.Commit.Author.Avatar = s }, c.String)
+
+ // Workflow
+ metadataFileAndOverrideOrDefault(c, "workflow-name", func(s string) { m.Workflow.Name = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "workflow-number", func(i int64) { m.Workflow.Number = int(i) }, c.Int)
+ m.Workflow.Matrix = axis
+
+ // System
+ metadataFileAndOverrideOrDefault(c, "system-name", func(s string) { m.Sys.Name = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "system-url", func(s string) { m.Sys.URL = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "system-host", func(s string) { m.Sys.Host = s }, c.String)
+ m.Sys.Platform = platform
+ m.Sys.Version = version.Version
+
+ // Forge
+ metadataFileAndOverrideOrDefault(c, "forge-type", func(s string) { m.Forge.Type = s }, c.String)
+ metadataFileAndOverrideOrDefault(c, "forge-url", func(s string) { m.Forge.URL = s }, c.String)
+
+ if w != nil {
+ m.Workflow = *w
+ }
+
+ return m, nil
+}
+
+// metadataFileAndOverrideOrDefault will either use the flag default or if metadata file is set only overload if explicit set.
+func metadataFileAndOverrideOrDefault[T any](c *cli.Command, flag string, setter func(T), getter func(string) T) {
+ if !c.IsSet("metadata-file") || c.IsSet(flag) {
+ setter(getter(flag))
}
}
diff --git a/cli/exec/metadata_test.go b/cli/exec/metadata_test.go
new file mode 100644
index 000000000..188426e8d
--- /dev/null
+++ b/cli/exec/metadata_test.go
@@ -0,0 +1,142 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package exec
+
+import (
+ "context"
+ "encoding/json"
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+ "github.com/urfave/cli/v3"
+
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/metadata"
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/matrix"
+)
+
+func TestMetadataFromContext(t *testing.T) {
+ sampleMetadata := &metadata.Metadata{
+ Repo: metadata.Repo{Owner: "test-user", Name: "test-repo"},
+ Curr: metadata.Pipeline{Number: 5},
+ }
+
+ runCommand := func(flags []cli.Flag, fn func(c *cli.Command)) {
+ c := &cli.Command{
+ Flags: flags,
+ Action: func(_ context.Context, c *cli.Command) error {
+ fn(c)
+ return nil
+ },
+ }
+ assert.NoError(t, c.Run(context.Background(), []string{"woodpecker-cli"}))
+ }
+
+ t.Run("LoadFromFile", func(t *testing.T) {
+ tempFileName := createTempFile(t, sampleMetadata)
+
+ flags := []cli.Flag{
+ &cli.StringFlag{Name: "metadata-file"},
+ }
+
+ runCommand(flags, func(c *cli.Command) {
+ _ = c.Set("metadata-file", tempFileName)
+
+ m, err := metadataFromContext(context.Background(), c, nil, nil)
+ require.NoError(t, err)
+ assert.Equal(t, "test-repo", m.Repo.Name)
+ assert.Equal(t, int64(5), m.Curr.Number)
+ })
+ })
+
+ t.Run("OverrideFromFlags", func(t *testing.T) {
+ tempFileName := createTempFile(t, sampleMetadata)
+
+ flags := []cli.Flag{
+ &cli.StringFlag{Name: "metadata-file"},
+ &cli.StringFlag{Name: "repo-name"},
+ &cli.IntFlag{Name: "pipeline-number"},
+ }
+
+ runCommand(flags, func(c *cli.Command) {
+ _ = c.Set("metadata-file", tempFileName)
+ _ = c.Set("repo-name", "aUser/override-repo")
+ _ = c.Set("pipeline-number", "10")
+
+ m, err := metadataFromContext(context.Background(), c, nil, nil)
+ require.NoError(t, err)
+ assert.Equal(t, "override-repo", m.Repo.Name)
+ assert.Equal(t, int64(10), m.Curr.Number)
+ })
+ })
+
+ t.Run("InvalidFile", func(t *testing.T) {
+ tempFile, err := os.CreateTemp("", "invalid.json")
+ require.NoError(t, err)
+ t.Cleanup(func() { os.Remove(tempFile.Name()) })
+
+ _, err = tempFile.Write([]byte("invalid json"))
+ require.NoError(t, err)
+
+ flags := []cli.Flag{
+ &cli.StringFlag{Name: "metadata-file"},
+ }
+
+ runCommand(flags, func(c *cli.Command) {
+ _ = c.Set("metadata-file", tempFile.Name())
+
+ _, err = metadataFromContext(context.Background(), c, nil, nil)
+ assert.Error(t, err)
+ })
+ })
+
+ t.Run("DefaultValues", func(t *testing.T) {
+ flags := []cli.Flag{
+ &cli.StringFlag{Name: "repo-name", Value: "test/default-repo"},
+ &cli.IntFlag{Name: "pipeline-number", Value: 1},
+ }
+
+ runCommand(flags, func(c *cli.Command) {
+ m, err := metadataFromContext(context.Background(), c, nil, nil)
+ require.NoError(t, err)
+ if assert.NotNil(t, m) {
+ assert.Equal(t, "test", m.Repo.Owner)
+ assert.Equal(t, "default-repo", m.Repo.Name)
+ assert.Equal(t, int64(1), m.Curr.Number)
+ }
+ })
+ })
+
+ t.Run("MatrixAxis", func(t *testing.T) {
+ runCommand([]cli.Flag{}, func(c *cli.Command) {
+ axis := matrix.Axis{"go": "1.16", "os": "linux"}
+ m, err := metadataFromContext(context.Background(), c, axis, nil)
+ require.NoError(t, err)
+ assert.EqualValues(t, map[string]string{"go": "1.16", "os": "linux"}, m.Workflow.Matrix)
+ })
+ })
+}
+
+func createTempFile(t *testing.T, content any) string {
+ t.Helper()
+ tempFile, err := os.CreateTemp("", "metadata.json")
+ require.NoError(t, err)
+ t.Cleanup(func() { os.Remove(tempFile.Name()) })
+
+ err = json.NewEncoder(tempFile).Encode(content)
+ require.NoError(t, err)
+ return tempFile.Name()
+}
diff --git a/cli/lint/lint.go b/cli/lint/lint.go
index 1e053369d..56b17bae9 100644
--- a/cli/lint/lint.go
+++ b/cli/lint/lint.go
@@ -27,6 +27,7 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/cli/common"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/linter"
+ "go.woodpecker-ci.org/woodpecker/v2/shared/constant"
)
// Command exports the info command.
@@ -35,6 +36,19 @@ var Command = &cli.Command{
Usage: "lint a pipeline configuration file",
ArgsUsage: "[path/to/.woodpecker.yaml]",
Action: lint,
+ Flags: []cli.Flag{
+ &cli.StringSliceFlag{
+ Sources: cli.EnvVars("WOODPECKER_PLUGINS_PRIVILEGED"),
+ Name: "plugins-privileged",
+ Usage: "Allow plugins to run in privileged mode, if environment variable is defined but empty there will be none",
+ },
+ &cli.StringSliceFlag{
+ Sources: cli.EnvVars("WOODPECKER_PLUGINS_TRUSTED_CLONE"),
+ Name: "plugins-trusted-clone",
+ Usage: "Plugins which are trusted to handle the netrc info in clone steps",
+ Value: constant.TrustedClonePlugins,
+ },
+ },
}
func lint(ctx context.Context, c *cli.Command) error {
@@ -69,7 +83,7 @@ func lintDir(ctx context.Context, c *cli.Command, dir string) error {
return nil
}
-func lintFile(_ context.Context, _ *cli.Command, file string) error {
+func lintFile(_ context.Context, c *cli.Command, file string) error {
fi, err := os.Open(file)
if err != nil {
return err
@@ -83,7 +97,7 @@ func lintFile(_ context.Context, _ *cli.Command, file string) error {
rawConfig := string(buf)
- c, err := yaml.ParseString(rawConfig)
+ parsedConfig, err := yaml.ParseString(rawConfig)
if err != nil {
return err
}
@@ -91,11 +105,19 @@ func lintFile(_ context.Context, _ *cli.Command, file string) error {
config := &linter.WorkflowConfig{
File: path.Base(file),
RawConfig: rawConfig,
- Workflow: c,
+ Workflow: parsedConfig,
}
// TODO: lint multiple files at once to allow checks for sth like "depends_on" to work
- err = linter.New(linter.WithTrusted(true)).Lint([]*linter.WorkflowConfig{config})
+ err = linter.New(
+ linter.WithTrusted(linter.TrustedConfiguration{
+ Network: true,
+ Volumes: true,
+ Security: true,
+ }),
+ linter.PrivilegedPlugins(c.StringSlice("plugins-privileged")),
+ linter.WithTrustedClonePlugins(c.StringSlice("plugins-trusted-clone")),
+ ).Lint([]*linter.WorkflowConfig{config})
if err != nil {
str, err := FormatLintError(config.File, err)
diff --git a/cli/secret/secret_info.go b/cli/secret/secret_info.go
index 4f69cbada..f645741b9 100644
--- a/cli/secret/secret_info.go
+++ b/cli/secret/secret_info.go
@@ -16,6 +16,7 @@ package secret
import (
"context"
+ "fmt"
"html/template"
"os"
@@ -51,6 +52,11 @@ func secretInfo(ctx context.Context, c *cli.Command) error {
secretName = c.String("name")
format = c.String("format") + "\n"
)
+
+ if secretName == "" {
+ return fmt.Errorf("secret name is missing")
+ }
+
client, err := internal.NewClient(ctx, c)
if err != nil {
return err
diff --git a/cmd/agent/core/agent.go b/cmd/agent/core/agent.go
index dea39a8a5..cba6249b1 100644
--- a/cmd/agent/core/agent.go
+++ b/cmd/agent/core/agent.go
@@ -20,6 +20,7 @@ import (
"crypto/tls"
"errors"
"fmt"
+ "maps"
"net/http"
"os"
"strings"
@@ -156,7 +157,7 @@ func run(ctx context.Context, c *cli.Command, backends []types.Backend) error {
}
defer conn.Close()
- client := agent_rpc.NewGrpcClient(conn)
+ client := agent_rpc.NewGrpcClient(ctx, conn)
agentConfigPersisted := atomic.Bool{}
grpcCtx := metadata.NewOutgoingContext(grpcClientCtx, metadata.Pairs("hostname", hostname))
@@ -198,7 +199,22 @@ func run(ctx context.Context, c *cli.Command, backends []types.Backend) error {
log.Debug().Msgf("loaded %s backend engine", backendEngine.Name())
maxWorkflows := int(c.Int("max-workflows"))
- agentConfig.AgentID, err = client.RegisterAgent(grpcCtx, engInfo.Platform, backendEngine.Name(), version.String(), maxWorkflows) //nolint:contextcheck
+
+ customLabels := make(map[string]string)
+ if err := stringSliceAddToMap(c.StringSlice("labels"), customLabels); err != nil {
+ return err
+ }
+ if len(customLabels) != 0 {
+ log.Debug().Msgf("custom labels detected: %#v", customLabels)
+ }
+
+ agentConfig.AgentID, err = client.RegisterAgent(grpcCtx, rpc.AgentInfo{ //nolint:contextcheck
+ Version: version.String(),
+ Backend: backendEngine.Name(),
+ Platform: engInfo.Platform,
+ Capacity: maxWorkflows,
+ CustomLabels: customLabels,
+ })
if err != nil {
return err
}
@@ -210,7 +226,7 @@ func run(ctx context.Context, c *cli.Command, backends []types.Backend) error {
<-agentCtx.Done()
// Remove stateless agents from server
if !agentConfigPersisted.Load() {
- log.Debug().Msg("unregistering agent from server ...")
+ log.Debug().Msg("unregister agent from server ...")
// we want to run it explicit run when context got canceled so run it in background
err := client.UnregisterAgent(grpcClientCtx)
if err != nil {
@@ -228,16 +244,17 @@ func run(ctx context.Context, c *cli.Command, backends []types.Backend) error {
}
}
+ // set default labels ...
labels := map[string]string{
"hostname": hostname,
"platform": engInfo.Platform,
"backend": backendEngine.Name(),
"repo": "*", // allow all repos by default
}
+ // ... and let it overwrite by custom ones
+ maps.Copy(labels, customLabels)
- if err := stringSliceAddToMap(c.StringSlice("filter"), labels); err != nil {
- return err
- }
+ log.Debug().Any("labels", labels).Msgf("agent configured with labels")
filter := rpc.Filter{
Labels: labels,
diff --git a/cmd/agent/core/flags.go b/cmd/agent/core/flags.go
index 6770e36bd..5afcb0e6b 100644
--- a/cmd/agent/core/flags.go
+++ b/cmd/agent/core/flags.go
@@ -60,8 +60,9 @@ var flags = []cli.Flag{
Value: "/etc/woodpecker/agent.conf",
},
&cli.StringSliceFlag{
- Sources: cli.EnvVars("WOODPECKER_FILTER_LABELS"),
- Name: "filter",
+ Sources: cli.EnvVars("WOODPECKER_AGENT_LABELS", "WOODPECKER_FILTER_LABELS"), // remove WOODPECKER_FILTER_LABELS in v4.x
+ Name: "labels",
+ Aliases: []string{"filter"}, // remove in v4.x
Usage: "List of labels to filter tasks on. An agent must be assigned every tag listed in a task to be selected.",
},
&cli.IntFlag{
diff --git a/cmd/cli/app.go b/cmd/cli/app.go
index 4b3fe6698..086914804 100644
--- a/cmd/cli/app.go
+++ b/cmd/cli/app.go
@@ -29,7 +29,6 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/cli/org"
"go.woodpecker-ci.org/woodpecker/v2/cli/pipeline"
"go.woodpecker-ci.org/woodpecker/v2/cli/repo"
- "go.woodpecker-ci.org/woodpecker/v2/cli/repo/registry"
"go.woodpecker-ci.org/woodpecker/v2/cli/secret"
"go.woodpecker-ci.org/woodpecker/v2/cli/setup"
"go.woodpecker-ci.org/woodpecker/v2/cli/update"
@@ -57,8 +56,6 @@ func newApp() *cli.Command {
deploy.Command,
exec.Command,
info.Command,
- // TODO: Remove in 3.x
- registry.Command,
secret.Command,
user.Command,
lint.Command,
diff --git a/cmd/server/docs/docs.go b/cmd/server/docs/docs.go
index 3113408cc..4f13dacbe 100644
--- a/cmd/server/docs/docs.go
+++ b/cmd/server/docs/docs.go
@@ -101,7 +101,7 @@ const docTemplate = `{
}
}
},
- "/agents/{agent}": {
+ "/agents/{agent_id}": {
"get": {
"produces": [
"application/json"
@@ -211,7 +211,7 @@ const docTemplate = `{
}
}
},
- "/agents/{agent}/tasks": {
+ "/agents/{agent_id}/tasks": {
"get": {
"produces": [
"application/json"
@@ -1063,6 +1063,193 @@ const docTemplate = `{
}
}
},
+ "/orgs/{org_id}/agents": {
+ "get": {
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Agents"
+ ],
+ "summary": "List agents for an organization",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "Bearer \u003cpersonal access token\u003e",
+ "description": "Insert your personal access token",
+ "name": "Authorization",
+ "in": "header",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "description": "the organization's id",
+ "name": "org_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "default": 1,
+ "description": "for response pagination, page offset number",
+ "name": "page",
+ "in": "query"
+ },
+ {
+ "type": "integer",
+ "default": 50,
+ "description": "for response pagination, max items per page",
+ "name": "perPage",
+ "in": "query"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Agent"
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "description": "Creates a new agent with a random token, scoped to the specified organization",
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Agents"
+ ],
+ "summary": "Create a new organization-scoped agent",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "Bearer \u003cpersonal access token\u003e",
+ "description": "Insert your personal access token",
+ "name": "Authorization",
+ "in": "header",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "description": "the organization's id",
+ "name": "org_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "the agent's data (only 'name' and 'no_schedule' are read)",
+ "name": "agent",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/Agent"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/Agent"
+ }
+ }
+ }
+ }
+ },
+ "/orgs/{org_id}/agents/{agent_id}": {
+ "delete": {
+ "produces": [
+ "text/plain"
+ ],
+ "tags": [
+ "Agents"
+ ],
+ "summary": "Delete an organization-scoped agent",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "Bearer \u003cpersonal access token\u003e",
+ "description": "Insert your personal access token",
+ "name": "Authorization",
+ "in": "header",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "description": "the organization's id",
+ "name": "org_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "description": "the agent's id",
+ "name": "agent_id",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "No Content"
+ }
+ }
+ },
+ "patch": {
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Agents"
+ ],
+ "summary": "Update an organization-scoped agent",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "Bearer \u003cpersonal access token\u003e",
+ "description": "Insert your personal access token",
+ "name": "Authorization",
+ "in": "header",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "description": "the organization's id",
+ "name": "org_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "description": "the agent's id",
+ "name": "agent_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "description": "the agent's updated data",
+ "name": "agent",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/Agent"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/Agent"
+ }
+ }
+ }
+ }
+ },
"/orgs/{org_id}/permissions": {
"get": {
"produces": [
@@ -3144,6 +3331,49 @@ const docTemplate = `{
}
}
},
+ "/repos/{repo_id}/pipelines/{number}/metadata": {
+ "get": {
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "Pipelines"
+ ],
+ "summary": "Get metadata for a pipeline or a specific workflow, including previous pipeline info",
+ "parameters": [
+ {
+ "type": "string",
+ "default": "Bearer \u003cpersonal access token\u003e",
+ "description": "Insert your personal access token",
+ "name": "Authorization",
+ "in": "header",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "description": "the repository id",
+ "name": "repo_id",
+ "in": "path",
+ "required": true
+ },
+ {
+ "type": "integer",
+ "description": "the number of the pipeline",
+ "name": "number",
+ "in": "path",
+ "required": true
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "OK",
+ "schema": {
+ "$ref": "#/definitions/metadata.Metadata"
+ }
+ }
+ }
+ }
+ },
"/repos/{repo_id}/pull_requests": {
"get": {
"produces": [
@@ -4359,6 +4589,12 @@ const docTemplate = `{
"created": {
"type": "integer"
},
+ "custom_labels": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
"id": {
"type": "integer"
},
@@ -4375,6 +4611,10 @@ const docTemplate = `{
"no_schedule": {
"type": "boolean"
},
+ "org_id": {
+ "description": "OrgID is counted as unset if set to -1, this is done to ensure a new(Agent) still enforce the OrgID check by default",
+ "type": "integer"
+ },
"owner_id": {
"type": "integer"
},
@@ -4415,8 +4655,7 @@ const docTemplate = `{
"branch": {
"type": "string"
},
- "created_at": {
- "description": "TODO change JSON field to \"created\" in 3.0",
+ "created": {
"type": "integer"
},
"creator_id": {
@@ -4458,15 +4697,13 @@ const docTemplate = `{
"commit": {
"type": "string"
},
- "created_at": {
- "description": "TODO change JSON field to \"created\" in 3.0",
+ "created": {
"type": "integer"
},
"event": {
"type": "string"
},
- "finished_at": {
- "description": "TODO change JSON field to \"finished\" in 3.0",
+ "finished": {
"type": "integer"
},
"id": {
@@ -4487,8 +4724,7 @@ const docTemplate = `{
"repo_id": {
"type": "integer"
},
- "started_at": {
- "description": "TODO change JSON field to \"started\" in 3.0",
+ "started": {
"type": "integer"
},
"status": {
@@ -4645,8 +4881,7 @@ const docTemplate = `{
"commit": {
"type": "string"
},
- "created_at": {
- "description": "TODO change JSON field to \"created\" in 3.0",
+ "created": {
"type": "integer"
},
"deploy_task": {
@@ -4664,8 +4899,7 @@ const docTemplate = `{
"event": {
"$ref": "#/definitions/WebhookEvent"
},
- "finished_at": {
- "description": "TODO change JSON field to \"finished\" in 3.0",
+ "finished": {
"type": "integer"
},
"forge_url": {
@@ -4698,8 +4932,7 @@ const docTemplate = `{
"refspec": {
"type": "string"
},
- "reviewed_at": {
- "description": "TODO change JSON field to \"reviewed\" in 3.0",
+ "reviewed": {
"type": "integer"
},
"reviewed_by": {
@@ -4709,8 +4942,7 @@ const docTemplate = `{
"description": "uses reported user for webhooks and name of cron for cron pipelines",
"type": "string"
},
- "started_at": {
- "description": "TODO change JSON field to \"started\" in 3.0",
+ "started": {
"type": "integer"
},
"status": {
@@ -4722,8 +4954,7 @@ const docTemplate = `{
"title": {
"type": "string"
},
- "updated_at": {
- "description": "TODO change JSON field to \"updated\" in 3.0",
+ "updated": {
"type": "integer"
},
"variables": {
@@ -4868,7 +5099,7 @@ const docTemplate = `{
"type": "integer"
},
"trusted": {
- "type": "boolean"
+ "$ref": "#/definitions/model.TrustedConfiguration"
},
"visibility": {
"$ref": "#/definitions/RepoVisibility"
@@ -4903,7 +5134,7 @@ const docTemplate = `{
"type": "integer"
},
"trusted": {
- "type": "boolean"
+ "$ref": "#/definitions/model.TrustedConfigurationPatch"
},
"visibility": {
"type": "string"
@@ -5012,15 +5243,15 @@ const docTemplate = `{
"Step": {
"type": "object",
"properties": {
- "end_time": {
- "type": "integer"
- },
"error": {
"type": "string"
},
"exit_code": {
"type": "integer"
},
+ "finished": {
+ "type": "integer"
+ },
"id": {
"type": "integer"
},
@@ -5036,7 +5267,7 @@ const docTemplate = `{
"ppid": {
"type": "integer"
},
- "start_time": {
+ "started": {
"type": "integer"
},
"state": {
@@ -5073,12 +5304,6 @@ const docTemplate = `{
"agent_id": {
"type": "integer"
},
- "data": {
- "type": "array",
- "items": {
- "type": "integer"
- }
- },
"dep_status": {
"type": "object",
"additionalProperties": {
@@ -5163,6 +5388,239 @@ const docTemplate = `{
"EventManual"
]
},
+ "metadata.Author": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+ },
+ "metadata.Commit": {
+ "type": "object",
+ "properties": {
+ "author": {
+ "$ref": "#/definitions/metadata.Author"
+ },
+ "branch": {
+ "type": "string"
+ },
+ "changed_files": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "is_prerelease": {
+ "type": "boolean"
+ },
+ "labels": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "message": {
+ "type": "string"
+ },
+ "ref": {
+ "type": "string"
+ },
+ "refspec": {
+ "type": "string"
+ },
+ "sha": {
+ "type": "string"
+ }
+ }
+ },
+ "metadata.Forge": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ }
+ },
+ "metadata.Metadata": {
+ "type": "object",
+ "properties": {
+ "curr": {
+ "$ref": "#/definitions/metadata.Pipeline"
+ },
+ "forge": {
+ "$ref": "#/definitions/metadata.Forge"
+ },
+ "id": {
+ "type": "string"
+ },
+ "prev": {
+ "$ref": "#/definitions/metadata.Pipeline"
+ },
+ "repo": {
+ "$ref": "#/definitions/metadata.Repo"
+ },
+ "step": {
+ "$ref": "#/definitions/metadata.Step"
+ },
+ "sys": {
+ "$ref": "#/definitions/metadata.System"
+ },
+ "workflow": {
+ "$ref": "#/definitions/metadata.Workflow"
+ }
+ }
+ },
+ "metadata.Pipeline": {
+ "type": "object",
+ "properties": {
+ "commit": {
+ "$ref": "#/definitions/metadata.Commit"
+ },
+ "created": {
+ "type": "integer"
+ },
+ "cron": {
+ "type": "string"
+ },
+ "event": {
+ "type": "string"
+ },
+ "finished": {
+ "type": "integer"
+ },
+ "forge_url": {
+ "type": "string"
+ },
+ "number": {
+ "type": "integer"
+ },
+ "parent": {
+ "type": "integer"
+ },
+ "started": {
+ "type": "integer"
+ },
+ "status": {
+ "type": "string"
+ },
+ "target": {
+ "type": "string"
+ },
+ "task": {
+ "type": "string"
+ }
+ }
+ },
+ "metadata.Repo": {
+ "type": "object",
+ "properties": {
+ "clone_url": {
+ "type": "string"
+ },
+ "clone_url_ssh": {
+ "type": "string"
+ },
+ "default_branch": {
+ "type": "string"
+ },
+ "forge_url": {
+ "type": "string"
+ },
+ "id": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "owner": {
+ "type": "string"
+ },
+ "private": {
+ "type": "boolean"
+ },
+ "remote_id": {
+ "type": "string"
+ },
+ "scm": {
+ "type": "string"
+ },
+ "trusted": {
+ "$ref": "#/definitions/metadata.TrustedConfiguration"
+ }
+ }
+ },
+ "metadata.Step": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "number": {
+ "type": "integer"
+ }
+ }
+ },
+ "metadata.System": {
+ "type": "object",
+ "properties": {
+ "arch": {
+ "type": "string"
+ },
+ "host": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "metadata.TrustedConfiguration": {
+ "type": "object",
+ "properties": {
+ "network": {
+ "type": "boolean"
+ },
+ "security": {
+ "type": "boolean"
+ },
+ "volumes": {
+ "type": "boolean"
+ }
+ }
+ },
+ "metadata.Workflow": {
+ "type": "object",
+ "properties": {
+ "matrix": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "name": {
+ "type": "string"
+ },
+ "number": {
+ "type": "integer"
+ }
+ }
+ },
"model.ForgeType": {
"type": "string",
"enum": [
@@ -5184,6 +5642,34 @@ const docTemplate = `{
"ForgeTypeAddon"
]
},
+ "model.TrustedConfiguration": {
+ "type": "object",
+ "properties": {
+ "network": {
+ "type": "boolean"
+ },
+ "security": {
+ "type": "boolean"
+ },
+ "volumes": {
+ "type": "boolean"
+ }
+ }
+ },
+ "model.TrustedConfigurationPatch": {
+ "type": "object",
+ "properties": {
+ "network": {
+ "type": "boolean"
+ },
+ "security": {
+ "type": "boolean"
+ },
+ "volumes": {
+ "type": "boolean"
+ }
+ }
+ },
"model.Workflow": {
"type": "object",
"properties": {
@@ -5196,9 +5682,6 @@ const docTemplate = `{
"$ref": "#/definitions/Step"
}
},
- "end_time": {
- "type": "integer"
- },
"environ": {
"type": "object",
"additionalProperties": {
@@ -5208,6 +5691,9 @@ const docTemplate = `{
"error": {
"type": "string"
},
+ "finished": {
+ "type": "integer"
+ },
"id": {
"type": "integer"
},
@@ -5223,7 +5709,7 @@ const docTemplate = `{
"platform": {
"type": "string"
},
- "start_time": {
+ "started": {
"type": "integer"
},
"state": {
diff --git a/cmd/server/flags.go b/cmd/server/flags.go
index 697ff455f..3e8bbd8c2 100644
--- a/cmd/server/flags.go
+++ b/cmd/server/flags.go
@@ -27,14 +27,34 @@ import (
var flags = append([]cli.Flag{
&cli.BoolFlag{
- Sources: cli.EnvVars("WOODPECKER_LOG_XORM"),
- Name: "log-xorm",
- Usage: "enable xorm logging",
+ Sources: cli.EnvVars("WOODPECKER_DATABASE_LOG", "WOODPECKER_LOG_XORM"),
+ Name: "db-log",
+ Aliases: []string{"log-xorm"}, // TODO: remove in v4.0.0
+ Usage: "enable logging in database engine (currently xorm)",
},
&cli.BoolFlag{
- Sources: cli.EnvVars("WOODPECKER_LOG_XORM_SQL"),
- Name: "log-xorm-sql",
- Usage: "enable xorm sql command logging",
+ Sources: cli.EnvVars("WOODPECKER_DATABASE_LOG_SQL", "WOODPECKER_LOG_XORM_SQL"),
+ Name: "db-log-sql",
+ Aliases: []string{"log-xorm-sql"}, // TODO: remove in v4.0.0
+ Usage: "enable logging of sql commands",
+ },
+ &cli.IntFlag{
+ Sources: cli.EnvVars("WOODPECKER_DATABASE_MAX_CONNECTIONS"),
+ Name: "db-max-open-connections",
+ Usage: "max connections xorm is allowed create",
+ Value: 100,
+ },
+ &cli.IntFlag{
+ Sources: cli.EnvVars("WOODPECKER_DATABASE_IDLE_CONNECTIONS"),
+ Name: "db-max-idle-connections",
+ Usage: "amount of connections xorm will hold open",
+ Value: 2,
+ },
+ &cli.DurationFlag{
+ Sources: cli.EnvVars("WOODPECKER_DATABASE_CONNECTION_TIMEOUT"),
+ Name: "db-max-connection-timeout",
+ Usage: "time an active connection is allowed to stay open",
+ Value: 3 * time.Second,
},
&cli.StringFlag{
Sources: cli.EnvVars("WOODPECKER_HOST"),
@@ -135,10 +155,11 @@ var flags = append([]cli.Flag{
Value: []string{"push", "pull_request"},
},
&cli.StringFlag{
- Sources: cli.EnvVars("WOODPECKER_DEFAULT_CLONE_IMAGE"),
- Name: "default-clone-image",
+ Sources: cli.EnvVars("WOODPECKER_DEFAULT_CLONE_PLUGIN", "WOODPECKER_DEFAULT_CLONE_IMAGE"),
+ Name: "default-clone-plugin",
+ Aliases: []string{"default-clone-image"},
Usage: "The default docker image to be used when cloning the repo",
- Value: constant.DefaultCloneImage,
+ Value: constant.DefaultClonePlugin,
},
&cli.IntFlag{
Sources: cli.EnvVars("WOODPECKER_DEFAULT_PIPELINE_TIMEOUT"),
@@ -159,10 +180,15 @@ var flags = append([]cli.Flag{
Value: time.Hour * 72,
},
&cli.StringSliceFlag{
- Sources: cli.EnvVars("WOODPECKER_ESCALATE"),
- Name: "escalate",
- Usage: "images to run in privileged mode",
- Value: constant.PrivilegedPlugins,
+ Sources: cli.EnvVars("WOODPECKER_PLUGINS_PRIVILEGED"),
+ Name: "plugins-privileged",
+ Usage: "Allow plugins to run in privileged mode, if environment variable is defined but empty there will be none",
+ },
+ &cli.StringSliceFlag{
+ Sources: cli.EnvVars("WOODPECKER_PLUGINS_TRUSTED_CLONE"),
+ Name: "plugins-trusted-clone",
+ Usage: "Plugins which are trusted to handle the netrc info in clone steps",
+ Value: constant.TrustedClonePlugins,
},
&cli.StringSliceFlag{
Sources: cli.EnvVars("WOODPECKER_VOLUME"),
@@ -199,7 +225,8 @@ var flags = append([]cli.Flag{
},
&cli.StringFlag{
Sources: cli.EnvVars("WOODPECKER_DATABASE_DRIVER"),
- Name: "driver",
+ Name: "db-driver",
+ Aliases: []string{"driver"}, // TODO: remove in v4.0.0
Usage: "database driver",
Value: "sqlite3",
},
@@ -207,9 +234,10 @@ var flags = append([]cli.Flag{
Sources: cli.NewValueSourceChain(
cli.File(os.Getenv("WOODPECKER_DATABASE_DATASOURCE_FILE")),
cli.EnvVar("WOODPECKER_DATABASE_DATASOURCE")),
- Name: "datasource",
- Usage: "database driver configuration string",
- Value: datasourceDefaultValue(),
+ Name: "db-datasource",
+ Aliases: []string{"datasource"}, // TODO: remove in v4.0.0
+ Usage: "database driver configuration string",
+ Value: datasourceDefaultValue(),
},
&cli.StringFlag{
Sources: cli.NewValueSourceChain(
@@ -281,7 +309,7 @@ var flags = append([]cli.Flag{
Sources: cli.EnvVars("WOODPECKER_FORGE_TIMEOUT"),
Name: "forge-timeout",
Usage: "how many seconds before timeout when fetching the Woodpecker configuration from a Forge",
- Value: time.Second * 3,
+ Value: time.Second * 5,
},
&cli.UintFlag{
Sources: cli.EnvVars("WOODPECKER_FORGE_RETRY"),
@@ -289,36 +317,8 @@ var flags = append([]cli.Flag{
Usage: "How many retries of fetching the Woodpecker configuration from a forge are done before we fail",
Value: 3,
},
- &cli.IntFlag{
- Sources: cli.EnvVars("WOODPECKER_LIMIT_MEM_SWAP"),
- Name: "limit-mem-swap",
- Usage: "maximum memory used for swap in bytes",
- },
- &cli.IntFlag{
- Sources: cli.EnvVars("WOODPECKER_LIMIT_MEM"),
- Name: "limit-mem",
- Usage: "maximum memory allowed in bytes",
- },
- &cli.IntFlag{
- Sources: cli.EnvVars("WOODPECKER_LIMIT_SHM_SIZE"),
- Name: "limit-shm-size",
- Usage: "docker compose /dev/shm allowed in bytes",
- },
- &cli.IntFlag{
- Sources: cli.EnvVars("WOODPECKER_LIMIT_CPU_QUOTA"),
- Name: "limit-cpu-quota",
- Usage: "impose a cpu quota",
- },
- &cli.IntFlag{
- Sources: cli.EnvVars("WOODPECKER_LIMIT_CPU_SHARES"),
- Name: "limit-cpu-shares",
- Usage: "change the cpu shares",
- },
- &cli.StringFlag{
- Sources: cli.EnvVars("WOODPECKER_LIMIT_CPU_SET"),
- Name: "limit-cpu-set",
- Usage: "set the cpus allowed to execute containers",
- },
+ //
+ // generic forge settings
//
&cli.StringFlag{
Name: "forge-url",
@@ -378,7 +378,7 @@ var flags = append([]cli.Flag{
"WOODPECKER_BITBUCKET_SKIP_VERIFY"),
},
&cli.StringFlag{
- Sources: cli.EnvVars("WOODPECKER_EXPERT_FORGE_OAUTH_HOST", "WOODPECKER_DEV_GITEA_OAUTH_URL"), // TODO: remove WOODPECKER_DEV_GITEA_OAUTH_URL in next major release
+ Sources: cli.EnvVars("WOODPECKER_EXPERT_FORGE_OAUTH_HOST"),
Name: "forge-oauth-host",
Usage: "!!!for experts!!! fully qualified public forge url. Use it if your forge url WOODPECKER_FORGE_URL or WOODPECKER_GITEA_URL, ... isn't a public url. Format: ://[/]",
},
@@ -477,18 +477,10 @@ var flags = append([]cli.Flag{
// expert flags
//
&cli.StringFlag{
- Sources: cli.EnvVars("WOODPECKER_EXPERT_WEBHOOK_HOST", "WOODPECKER_WEBHOOK_HOST"), // TODO: remove WOODPECKER_WEBHOOK_HOST in next major release
+ Sources: cli.EnvVars("WOODPECKER_EXPERT_WEBHOOK_HOST"),
Name: "server-webhook-host",
Usage: "!!!for experts!!! fully qualified woodpecker server url called by forge's webhooks. Format: ://[/]",
},
- // TODO: remove in next major release
- &cli.StringFlag{
- Sources: cli.EnvVars("WOODPECKER_DEV_OAUTH_HOST"),
- Name: "server-dev-oauth-host-deprecated",
- Usage: "DEPRECATED: use WOODPECKER_EXPERT_FORGE_OAUTH_HOST instead\nfully qualified url used for oauth redirects. Format: ://[/]",
- Value: "",
- Hidden: true,
- },
//
// secrets encryption in DB
//
diff --git a/cmd/server/grpc_server.go b/cmd/server/grpc_server.go
index 16da47f05..f983bb158 100644
--- a/cmd/server/grpc_server.go
+++ b/cmd/server/grpc_server.go
@@ -33,7 +33,7 @@ import (
func runGrpcServer(ctx context.Context, c *cli.Command, _store store.Store) error {
lis, err := net.Listen("tcp", c.String("grpc-addr"))
if err != nil {
- log.Fatal().Err(err).Msg("failed to listen on grpc-addr") //nolint:forbidigo
+ return fmt.Errorf("failed to listen on grpc-addr: %w", err)
}
jwtSecret := c.String("grpc-secret")
diff --git a/cmd/server/setup.go b/cmd/server/setup.go
index 71c2ac71d..83a92f01f 100644
--- a/cmd/server/setup.go
+++ b/cmd/server/setup.go
@@ -43,7 +43,6 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/server/store"
"go.woodpecker-ci.org/woodpecker/v2/server/store/datastore"
"go.woodpecker-ci.org/woodpecker/v2/server/store/types"
- "go.woodpecker-ci.org/woodpecker/v2/shared/constant"
)
const (
@@ -52,11 +51,14 @@ const (
)
func setupStore(ctx context.Context, c *cli.Command) (store.Store, error) {
- datasource := c.String("datasource")
- driver := c.String("driver")
+ datasource := c.String("db-datasource")
+ driver := c.String("db-driver")
xorm := store.XORM{
- Log: c.Bool("log-xorm"),
- ShowSQL: c.Bool("log-xorm-sql"),
+ Log: c.Bool("db-log"),
+ ShowSQL: c.Bool("db-log-sql"),
+ MaxOpenConns: int(c.Int("db-max-open-connections")),
+ MaxIdleConns: int(c.Int("db-max-idle-connections")),
+ ConnMaxLifetime: c.Duration("db-max-connection-timeout"),
}
if driver == "sqlite3" {
@@ -104,8 +106,11 @@ func checkSqliteFileExist(path string) error {
return err
}
-func setupQueue(ctx context.Context, s store.Store) queue.Queue {
- return queue.WithTaskStore(ctx, queue.New(ctx), s)
+func setupQueue(ctx context.Context, s store.Store) (queue.Queue, error) {
+ return queue.New(ctx, queue.Config{
+ Backend: queue.TypeMemory,
+ Store: s,
+ })
}
func setupMembershipService(_ context.Context, _store store.Store) cache.MembershipService {
@@ -144,18 +149,19 @@ func setupJWTSecret(_store store.Store) (string, error) {
return jwtSecret, nil
}
-func setupEvilGlobals(ctx context.Context, c *cli.Command, s store.Store) error {
+func setupEvilGlobals(ctx context.Context, c *cli.Command, s store.Store) (err error) {
// services
- server.Config.Services.Queue = setupQueue(ctx, s)
server.Config.Services.Logs = logging.New()
server.Config.Services.Pubsub = pubsub.New()
server.Config.Services.Membership = setupMembershipService(ctx, s)
- serviceManager, err := services.NewManager(c, s, setup.Forge)
+ server.Config.Services.Queue, err = setupQueue(ctx, s)
+ if err != nil {
+ return fmt.Errorf("could not setup queue: %w", err)
+ }
+ server.Config.Services.Manager, err = services.NewManager(c, s, setup.Forge)
if err != nil {
return fmt.Errorf("could not setup service manager: %w", err)
}
- server.Config.Services.Manager = serviceManager
-
server.Config.Services.LogStore, err = setupLogStore(c, s)
if err != nil {
return fmt.Errorf("could not setup log store: %w", err)
@@ -165,8 +171,9 @@ func setupEvilGlobals(ctx context.Context, c *cli.Command, s store.Store) error
server.Config.Pipeline.AuthenticatePublicRepos = c.Bool("authenticate-public-repos")
// Cloning
- server.Config.Pipeline.DefaultCloneImage = c.String("default-clone-image")
- constant.TrustedCloneImages = append(constant.TrustedCloneImages, server.Config.Pipeline.DefaultCloneImage)
+ server.Config.Pipeline.DefaultClonePlugin = c.String("default-clone-plugin")
+ server.Config.Pipeline.TrustedClonePlugins = c.StringSlice("plugins-trusted-clone")
+ server.Config.Pipeline.TrustedClonePlugins = append(server.Config.Pipeline.TrustedClonePlugins, server.Config.Pipeline.DefaultClonePlugin)
// Execution
_events := c.StringSlice("default-cancel-previous-pipeline-events")
@@ -178,14 +185,6 @@ func setupEvilGlobals(ctx context.Context, c *cli.Command, s store.Store) error
server.Config.Pipeline.DefaultTimeout = c.Int("default-pipeline-timeout")
server.Config.Pipeline.MaxTimeout = c.Int("max-pipeline-timeout")
- // limits
- server.Config.Pipeline.Limits.MemSwapLimit = c.Int("limit-mem-swap")
- server.Config.Pipeline.Limits.MemLimit = c.Int("limit-mem")
- server.Config.Pipeline.Limits.ShmSize = c.Int("limit-shm-size")
- server.Config.Pipeline.Limits.CPUQuota = c.Int("limit-cpu-quota")
- server.Config.Pipeline.Limits.CPUShares = c.Int("limit-cpu-shares")
- server.Config.Pipeline.Limits.CPUSet = c.String("limit-cpu-set")
-
// backend options for pipeline compiler
server.Config.Pipeline.Proxy.No = c.String("backend-no-proxy")
server.Config.Pipeline.Proxy.HTTP = c.String("backend-http-proxy")
@@ -206,11 +205,7 @@ func setupEvilGlobals(ctx context.Context, c *cli.Command, s store.Store) error
} else {
server.Config.Server.WebhookHost = serverHost
}
- if c.IsSet("server-dev-oauth-host-deprecated") {
- server.Config.Server.OAuthHost = c.String("server-dev-oauth-host-deprecated")
- } else {
- server.Config.Server.OAuthHost = serverHost
- }
+ server.Config.Server.OAuthHost = serverHost
server.Config.Server.Port = c.String("server-addr")
server.Config.Server.PortTLS = c.String("server-addr-tls")
server.Config.Server.StatusContext = c.String("status-context")
@@ -226,9 +221,9 @@ func setupEvilGlobals(ctx context.Context, c *cli.Command, s store.Store) error
server.Config.Server.CustomJsFile = strings.TrimSpace(c.String("custom-js-file"))
server.Config.Pipeline.Networks = c.StringSlice("network")
server.Config.Pipeline.Volumes = c.StringSlice("volume")
- server.Config.Pipeline.Privileged = c.StringSlice("escalate")
server.Config.WebUI.EnableSwagger = c.Bool("enable-swagger")
server.Config.WebUI.SkipVersionCheck = c.Bool("skip-version-check")
+ server.Config.Pipeline.PrivilegedPlugins = c.StringSlice("plugins-privileged")
// prometheus
server.Config.Prometheus.AuthToken = c.String("prometheus-auth-token")
diff --git a/cmd/server/swagger.go b/cmd/server/swagger.go
index a38ec599e..2acb8be76 100644
--- a/cmd/server/swagger.go
+++ b/cmd/server/swagger.go
@@ -33,7 +33,7 @@ func setupSwaggerStaticConfig() {
docs.SwaggerInfo.InfoInstanceName = "api"
docs.SwaggerInfo.Title = "Woodpecker CI API"
docs.SwaggerInfo.Version = version.String()
- docs.SwaggerInfo.Description = "Woodpecker is a simple yet powerful CI/CD engine with great extensibility.\n" +
+ docs.SwaggerInfo.Description = "Woodpecker is a simple, yet powerful CI/CD engine with great extensibility.\n" +
"To get a personal access token (PAT) for authentication, please log in your Woodpecker server,\n" +
"and go to you personal profile page, by clicking the user icon at the top right."
}
diff --git a/cmd/server/woodpecker_docs_gen.go b/cmd/server/woodpecker_docs_gen.go
index 0ca776671..9c3eac261 100644
--- a/cmd/server/woodpecker_docs_gen.go
+++ b/cmd/server/woodpecker_docs_gen.go
@@ -24,6 +24,7 @@ package main
import (
"context"
"encoding/json"
+ "fmt"
"os"
"path"
@@ -57,6 +58,7 @@ func main() {
// convert to OpenApi3
if err := toOpenApi3(filePath, filePath); err != nil {
+ fmt.Printf("converting '%s' from openapi v2 to v3 failed\n", filePath)
panic(err)
}
}
@@ -77,18 +79,18 @@ func removeHost(jsonIn string) (string, error) {
func toOpenApi3(input, output string) error {
data2, err := os.ReadFile(input)
if err != nil {
- return err
+ return fmt.Errorf("read input: %w", err)
}
var doc2 openapi2.T
err = json.Unmarshal(data2, &doc2)
if err != nil {
- return err
+ return fmt.Errorf("unmarshal input: %w", err)
}
doc3, err := openapi2conv.ToV3(&doc2)
if err != nil {
- return err
+ return fmt.Errorf("convert openapi v2 to v3: %w", err)
}
err = doc3.Validate(context.Background())
if err != nil {
@@ -97,8 +99,12 @@ func toOpenApi3(input, output string) error {
data, err := json.Marshal(doc3)
if err != nil {
- return err
+ return fmt.Errorf("Marshal converted: %w", err)
}
- return os.WriteFile(output, data, 0o644)
+ if err = os.WriteFile(output, data, 0o644); err != nil {
+ return fmt.Errorf("write output: %w", err)
+ }
+
+ return nil
}
diff --git a/docker-compose.gitpod.yaml b/docker-compose.gitpod.yaml
index 8b111d791..b0fc5c7d2 100644
--- a/docker-compose.gitpod.yaml
+++ b/docker-compose.gitpod.yaml
@@ -3,7 +3,7 @@ version: '3'
services:
gitea-database:
- image: postgres:16.3-alpine
+ image: postgres:17.0-alpine
environment:
POSTGRES_USER: gitea
POSTGRES_PASSWORD: 123456
diff --git a/docker/Dockerfile.agent.alpine.multiarch b/docker/Dockerfile.agent.alpine.multiarch
index c15d113f8..74ece6be9 100644
--- a/docker/Dockerfile.agent.alpine.multiarch
+++ b/docker/Dockerfile.agent.alpine.multiarch
@@ -1,4 +1,4 @@
-FROM --platform=$BUILDPLATFORM docker.io/golang:1.22 AS build
+FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS build
WORKDIR /src
COPY . .
@@ -10,6 +10,8 @@ RUN --mount=type=cache,target=/root/.cache/go-build \
FROM docker.io/alpine:3.20
RUN apk add -U --no-cache ca-certificates
ENV GODEBUG=netdns=go
+# Internal setting do NOT change! Signals that woodpecker is running inside a container
+ENV WOODPECKER_IN_CONTAINER=true
EXPOSE 3000
COPY --from=build /src/dist/woodpecker-agent /bin/
diff --git a/docker/Dockerfile.agent.multiarch b/docker/Dockerfile.agent.multiarch
index 6349a3d50..ccf5b3a23 100644
--- a/docker/Dockerfile.agent.multiarch
+++ b/docker/Dockerfile.agent.multiarch
@@ -1,4 +1,4 @@
-FROM --platform=$BUILDPLATFORM docker.io/golang:1.22 AS build
+FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS build
WORKDIR /src
COPY . .
@@ -10,6 +10,8 @@ RUN mkdir -p /etc/woodpecker
FROM scratch
ENV GODEBUG=netdns=go
+# Internal setting do NOT change! Signals that woodpecker is running inside a container
+ENV WOODPECKER_IN_CONTAINER=true
EXPOSE 3000
# copy certs from build image
diff --git a/docker/Dockerfile.cli.alpine.multiarch b/docker/Dockerfile.cli.alpine.multiarch
index 0fbb3df90..de5fd0688 100644
--- a/docker/Dockerfile.cli.alpine.multiarch
+++ b/docker/Dockerfile.cli.alpine.multiarch
@@ -1,4 +1,4 @@
-FROM --platform=$BUILDPLATFORM docker.io/golang:1.22 AS build
+FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS build
WORKDIR /src
COPY . .
@@ -8,7 +8,10 @@ RUN --mount=type=cache,target=/root/.cache/go-build \
make build-cli
FROM docker.io/alpine:3.20
+WORKDIR /woodpecker
+
RUN apk add -U --no-cache ca-certificates
+
ENV GODEBUG=netdns=go
ENV WOODPECKER_DISABLE_UPDATE_CHECK=true
diff --git a/docker/Dockerfile.cli.multiarch b/docker/Dockerfile.cli.multiarch
index 2afeb82e2..2e1a7009f 100644
--- a/docker/Dockerfile.cli.multiarch
+++ b/docker/Dockerfile.cli.multiarch
@@ -1,4 +1,4 @@
-FROM --platform=$BUILDPLATFORM docker.io/golang:1.22 AS build
+FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS build
WORKDIR /src
COPY . .
@@ -8,6 +8,8 @@ RUN --mount=type=cache,target=/root/.cache/go-build \
make build-cli
FROM scratch
+WORKDIR /woodpecker
+
ENV GODEBUG=netdns=go
ENV WOODPECKER_DISABLE_UPDATE_CHECK=true
diff --git a/docker/Dockerfile.make b/docker/Dockerfile.make
index d18cf733e..8bedc7dae 100644
--- a/docker/Dockerfile.make
+++ b/docker/Dockerfile.make
@@ -1,19 +1,8 @@
# docker build --rm -f docker/Dockerfile.make -t woodpecker/make:local .
-FROM docker.io/golang:1.22-alpine3.19 as golang_image
-FROM docker.io/node:22-alpine3.19
+FROM docker.io/golang:1.23-alpine as golang_image
+FROM docker.io/node:23-alpine
-# renovate: datasource=repology depName=alpine_3_19/make versioning=loose
-ENV MAKE_VERSION="4.4.1-r2"
-# renovate: datasource=repology depName=alpine_3_19/gcc versioning=loose
-ENV GCC_VERSION="13.2.1_git20231014-r0"
-# renovate: datasource=repology depName=alpine_3_19/binutils-gold versioning=loose
-ENV BINUTILS_GOLD_VERSION="2.41-r0"
-# renovate: datasource=repology depName=alpine_3_19/musl-dev versioning=loose
-ENV MUSL_DEV_VERSION="1.2.4_git20230717-r4"
-# renovate: datasource=repology depName=alpine_3_19/protoc versioning=loose
-ENV PROTOC_VERSION="24.4-r0"
-
-RUN apk add --no-cache --update make=${MAKE_VERSION} gcc=${GCC_VERSION} binutils-gold=${BINUTILS_GOLD_VERSION} musl-dev=${MUSL_DEV_VERSION} protoc=${PROTOC_VERSION} && \
+RUN apk add --no-cache --update make gcc binutils-gold musl-dev protoc && \
corepack enable
# Build packages.
diff --git a/docker/Dockerfile.server.multiarch b/docker/Dockerfile.server.multiarch
index 3bf86a3be..56e02b462 100644
--- a/docker/Dockerfile.server.multiarch
+++ b/docker/Dockerfile.server.multiarch
@@ -1,4 +1,4 @@
-FROM --platform=$BUILDPLATFORM docker.io/golang:1.22 AS certs
+FROM --platform=$BUILDPLATFORM docker.io/golang:1.23 AS certs
FROM scratch
ARG TARGETOS TARGETARCH
diff --git a/docs/blog/2023-11-09-release-v2.0.0/index.md b/docs/blog/2023-11-09-release-v2.0.0/index.md
index 1fc3db91e..1aa7c94b2 100644
--- a/docs/blog/2023-11-09-release-v2.0.0/index.md
+++ b/docs/blog/2023-11-09-release-v2.0.0/index.md
@@ -53,7 +53,7 @@ Security is pretty important to us and we want to make sure that no one can stea
## Migration notes
-There have been a few more breaking changes. [Read more about what you need to do when upgrading!](../docs/migrations#200)
+There have been a few more breaking changes. [Read more about what you need to do when upgrading!](/migrations#200)
## New features
diff --git a/docs/blog/2023-12-12-podman-image-builds/index.md b/docs/blog/2023-12-12-podman-image-builds/index.md
new file mode 100644
index 000000000..e0501de4a
--- /dev/null
+++ b/docs/blog/2023-12-12-podman-image-builds/index.md
@@ -0,0 +1,60 @@
+---
+title: '[Community] Podman-in-Podman image builds'
+description: Build images in Podman with buildah
+slug: podman-image-builds
+authors:
+ - name: handlebargh
+ url: https://github.com/handlebargh
+ image_url: https://github.com/handlebargh.png
+hide_table_of_contents: true
+tags: [community, image, podman]
+---
+
+
+
+I run Woodpecker CI with podman backend instead of docker and just figured out how to build images with buildah. Since I couldn't find this anywhere documented, I thought I might as well just share it here.
+
+
+
+It's actually pretty straight forward. Here's what my repository structure looks like:
+
+```bash
+.
+├── roundcube
+│ ├── Containerfile
+│ ├── docker-entrypoint.sh
+│ └── php.ini
+└── .woodpecker
+ └── .build_roundcube.yml
+```
+
+As you can see I'm building a roundcube mail image.
+
+This is the `.woodpecker/.build_roundcube.yaml`
+
+```yaml
+when:
+ event: [cron, manual]
+ cron: build_roundcube
+
+steps:
+ build-image:
+ image: quay.io/buildah/stable:latest
+ pull: true
+ privileged: true
+ commands:
+ - echo $REGISTRY_LOGIN_TOKEN | buildah login -u --password-stdin registry.gitlab.com
+ - cd roundcube
+ - buildah build --tag registry.gitlab.com///roundcube:latest .
+ - buildah push registry.gitlab.com///roundcube:latest
+
+ secrets: [registry_login_token]
+```
+
+As you can see, I'm using this workflow over at gitlab.com. It should work with GitHub as well, with adjusting the registry login.
+
+You may have to adjust the `when:` to your needs. Furthermore, you must check the `trusted` checkbox in project settings. Therefore, be sure to run trusted code only in this setup.
+
+This seems to work fine so far. I wonder if anybody else made this work a different way.
+
+EDIT: Removed the additional step that would run buildah in a podman container. I didn't know it could be that easy to be honest.
diff --git a/docs/blog/2023-12-13-debug-pipeline-steps/index.md b/docs/blog/2023-12-13-debug-pipeline-steps/index.md
new file mode 100644
index 000000000..7682d50bc
--- /dev/null
+++ b/docs/blog/2023-12-13-debug-pipeline-steps/index.md
@@ -0,0 +1,31 @@
+---
+title: '[Community] Debug pipeline steps'
+description: Debug pipeline steps using sshx
+slug: debug-pipeline-steps
+authors:
+ - name: anbraten
+ url: https://github.com/anbraten
+ image_url: https://github.com/anbraten.png
+hide_table_of_contents: true
+tags: [community, debug]
+---
+
+
+
+Sometimes you want to debug a pipeline.
+Therefore I recently discovered:
+
+
+
+A simple step like should allow you to debug:
+
+```yaml
+steps:
+ - name: debug
+ image: alpine
+ commands:
+ - curl -sSf https://sshx.io/get | sh && sshx
+ # ^
+ # └ This will open a remote terminal session and print the URL. It
+ # should take under a second.
+```
diff --git a/docs/blog/2023-12-15-podman-sigstore/index.md b/docs/blog/2023-12-15-podman-sigstore/index.md
new file mode 100644
index 000000000..e2600946e
--- /dev/null
+++ b/docs/blog/2023-12-15-podman-sigstore/index.md
@@ -0,0 +1,140 @@
+---
+title: '[Community] Podman image build with sigstore'
+description: Build images in Podman with sigstore signature checking and signing
+slug: podman-image-build-sigstore
+authors:
+ - name: handlebargh
+ url: https://github.com/handlebargh
+ image_url: https://github.com/handlebargh.png
+hide_table_of_contents: false
+tags: [community, image, podman, sigstore, signature]
+---
+
+
+
+This example shows how to build a container image with podman while verifying the base image and signing the resulting image.
+
+
+
+The image being pulled uses a keyless signature, while the image being built will be signed by a pre-generated private key.
+
+## Prerequisites
+
+### Generate signing keypair
+
+You can use cosing or skopeo to generate the keypair.
+
+Using skopeo:
+
+```bash
+skopeo generate-sigstore-key --output-prefix myKey
+```
+
+This command will generate a `myKey.private` and a `myKey.pub` keyfile.
+
+Store the `myKey.private` as secret in Woodpecker. In the example below, the secret is called `sigstore_private_key`
+
+### Configure hosts pulling the resulting image
+
+See [here](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/assembly_signing-container-images_building-running-and-managing-containers#proc_verifying-sigstore-image-signatures-using-a-public-key_assembly_signing-container-images) on how to configure the hosts pulling the built and signed image.
+
+## Repository structure
+
+Consider the `Makefile` having a `build` target that will be used in the following workflow.
+This target yields a Go binary with the filename `app` that will be placed in the root directory.
+
+```bash
+.
+├── Containerfile
+├── main.go
+├── go.mod
+├── go.sum
+├── .woodpecker.yml
+└── Makefile
+```
+
+### Containerfile
+
+The Containerfile refers to the base image that will be verified when pulled.
+
+```dockerfile
+FROM gcr.io/distroless/static-debian12:nonroot
+COPY app /app
+CMD ["/app"]
+```
+
+### Woodpecker workflow
+
+```yaml
+steps:
+ build:
+ image: docker.io/library/golang:1.21
+ pull: true
+ commands:
+ - make build
+
+ publish:
+ image: quay.io/podman/stable:latest
+ # Caution: This image is built daily. It might fill up your image store quickly.
+ pull: true
+ # Fill in the trusted checkbox in Woodpecker's settings as well
+ privileged: true
+ commands:
+ # Configure podman to use sigstore attachments for both, the registry you pull from and the registry you push to.
+ - |
+ printf "docker:
+ registry.gitlab.com:
+ use-sigstore-attachments: true
+ gcr.io:
+ use-sigstore-attachments: true" >> /etc/containers/registries.d/default.yaml
+
+ # At pull, check the keyless sigstore signature of the distroless image.
+ # This is a very strict container policy. It allows pulling from gcr.io/distroless only. Every other registry will be rejected.
+ # See https://github.com/containers/image/blob/main/docs/containers-policy.json.5.md for more information.
+
+ # fulcio CA crt obtained from https://github.com/sigstore/sigstore/blob/main/pkg/tuf/repository/targets/fulcio_v1.crt.pem
+ # rekor public key obtained from https://github.com/sigstore/sigstore/blob/main/pkg/tuf/repository/targets/rekor.pub
+ # crt/key data is base64 encoded. --> echo "$CERT" | base64
+ - |
+ printf '{
+ "default": [
+ {
+ "type": "reject"
+ }
+ ],
+ "transports": {
+ "docker": {
+ "gcr.io/distroless": [
+ {
+ "type": "sigstoreSigned",
+ "fulcio": {
+ "caData": "LS0tLS1CRUdJTiBDR...QVRFLS0tLS0K",
+ "oidcIssuer": "https://accounts.google.com",
+ "subjectEmail": "keyless@distroless.iam.gserviceaccount.com"
+ },
+ "rekorPublicKeyData": "LS0tLS1CRUdJTiBQVUJ...lDIEtFWS0tLS0tCg==",
+ "signedIdentity": { "type": "matchRepository" }
+ }
+ ]
+ },
+ "docker-daemon": {
+ "": [
+ {
+ "type": "reject"
+ }
+ ]
+ }
+ }
+ }' > /etc/containers/policy.json
+
+ # Use this key to sign the built image at push.
+ - echo "$SIGSTORE_PRIVATE_KEY" > key.private
+ # Login at the registry
+ - echo $REGISTRY_LOGIN_TOKEN | podman login -u --password-stdin registry.gitlab.com
+ # Build the container image
+ - podman build --tag registry.gitlab.com///:latest .
+ # Sign and push the image
+ - podman push --sign-by-sigstore-private-key ./key.private registry.gitlab.com///:latest
+
+ secrets: [sigstore_private_key, registry_login_token]
+```
diff --git a/docs/blog/2024-05-27-release-v2.5.0/index.md b/docs/blog/2024-05-27-release-v2.5.0/index.md
index 3f9bd3d6c..3de36b5ee 100644
--- a/docs/blog/2024-05-27-release-v2.5.0/index.md
+++ b/docs/blog/2024-05-27-release-v2.5.0/index.md
@@ -87,4 +87,4 @@ be removed in the next major release:
- Use `WOODPECKER_EXPERT_FORGE_OAUTH_HOST` instead of `WOODPECKER_DEV_GITEA_OAUTH_URL` or `WOODPECKER_DEV_OAUTH_HOST`
- Deprecated `WOODPECKER_WEBHOOK_HOST` in favor of `WOODPECKER_EXPERT_WEBHOOK_HOST`
-For a full list of deprecations that will be dropped in the `next` major release `3.0.0` (no eta yet), please check the [migrations](/docs/migrations#next) section.
+For a full list of deprecations that will be dropped in the `next` major release `3.0.0` (no eta yet), please check the [migrations](/migrations#next) section.
diff --git a/docs/docs/20-usage/10-intro.md b/docs/docs/20-usage/10-intro.md
index 87951bdd8..1c4baec1f 100644
--- a/docs/docs/20-usage/10-intro.md
+++ b/docs/docs/20-usage/10-intro.md
@@ -86,16 +86,17 @@ Sometimes you have some tasks that you need to do in every project. For example,
If you want to get a Slack notification after your pipeline has finished, you can add a Slack plugin to your pipeline:
```yaml
----
-- name: notify me on Slack
- image: plugins/slack
- settings:
- channel: developers
- username: woodpecker
- password:
- from_secret: slack_token
- when:
- status: [success, failure] # This will execute the step on success and failure
+steps:
+ # ...
+ - name: notify me on Slack
+ image: plugins/slack
+ settings:
+ channel: developers
+ username: woodpecker
+ password:
+ from_secret: slack_token
+ when:
+ status: [success, failure] # This will execute the step on success and failure
```
To configure a plugin you can use the `settings` section.
diff --git a/docs/docs/20-usage/15-terminology/index.md b/docs/docs/20-usage/15-terminology/index.md
index f05f18207..0b5eafd8a 100644
--- a/docs/docs/20-usage/15-terminology/index.md
+++ b/docs/docs/20-usage/15-terminology/index.md
@@ -7,18 +7,18 @@
- **Server**: The component of Woodpecker that handles webhooks from forges, orchestrates agents, and sends status back. It also serves the API and web UI for administration and configuration.
- **Agent**: A component of Woodpecker that executes [pipelines][Pipeline] (specifically one or more [workflows][Workflow]) with a specific backend (e.g. [Docker][], Kubernetes, [local][Local]). It connects to the server via GRPC.
- **CLI**: The Woodpecker command-line interface (CLI) is a terminal tool used to administer the server, to execute pipelines locally for debugging / testing purposes, and to perform tasks like linting pipelines.
-- **Pipeline**: A sequence of [workflows][Workflow] that are executed on the code. [Pipelines][Pipeline] are triggered by events.
-- **Workflow**: A sequence of steps and services that are executed as part of a [pipeline][Pipeline]. Workflows are represented by YAML files. Each [workflow][Workflow] has its own isolated [workspace][Workspace], and often additional resources like a shared network (docker).
+- **[Pipeline][Pipeline]**: A sequence of [workflows][Workflow] that are executed on the code. Pipelines are triggered by events.
+- **[Workflow][Workflow]**: A sequence of steps and services that are executed as part of a [pipeline][Pipeline]. Workflows are represented by YAML files. Each workflow has its own isolated [workspace][Workspace], and often additional resources like a shared network (docker).
- **Steps**: Individual commands, actions or tasks within a [workflow][Workflow].
- **Code**: Refers to the files tracked by the version control system used by the [forge][Forge].
- **Repos**: Short for repositories, these are storage locations where code is stored.
-- **Forge**: The hosting platform or service where the repositories are hosted.
-- **Workspace**: A folder shared between all steps of a [workflow][Workflow] containing the repository and all the generated data from previous steps.
-- **Event**: Triggers the execution of a [pipeline][Pipeline], such as a [forge][Forge] event like `push`, or `manual` triggered manually from the UI.
+- **[Forge][Forge]**: The hosting platform or service where the repositories are hosted.
+- **[Workspace][workspace]**: A folder shared between all steps of a [workflow][Workflow] containing the repository and all the generated data from previous steps.
+- **[Event][Event]**: Triggers the execution of a [pipeline][Pipeline], such as a [forge][Forge] event like `push`, or `manual` triggered manually from the UI.
- **Commit**: A defined state of the code, usually associated with a version control system like Git.
-- **Matrix**: A configuration option that allows the execution of [workflows][Workflow] for each value in the [matrix][Matrix].
+- **[Matrix][Matrix]**: A configuration option that allows the execution of [workflows][Workflow] for each value in the matrix.
- **Service**: A service is a step that is executed from the start of a [workflow][Workflow] until its end. It can be accessed by name via the network from other steps within the same [workflow][Workflow].
-- **Plugins**: [Plugins][Plugin] are extensions that provide pre-defined actions or commands for a step in a [workflow][Workflow]. They can be configured via settings.
+- **[Plugins][Plugin]**: Plugins are extensions that provide pre-defined actions or commands for a step in a [workflow][Workflow]. They can be configured via settings.
- **Container**: A lightweight and isolated environment where commands are executed.
- **YAML File**: A file format used to define and configure [workflows][Workflow].
- **Dependency**: [Workflows][Workflow] can depend on each other, and if possible, they are executed in parallel.
@@ -33,16 +33,6 @@
![Relation between pipelines, workflows and steps](pipeline-workflow-step.svg)
-## Pipeline events
-
-- `push`: A push event is triggered when a commit is pushed to a branch.
-- `pull_request`: A pull request event is triggered when a pull request is opened or a new commit is pushed to it.
-- `pull_request_closed`: A pull request closed event is triggered when a pull request is closed or merged.
-- `tag`: A tag event is triggered when a tag is pushed.
-- `release`: A release event is triggered when a release, pre-release or draft is created. (You can apply further filters using [evaluate](../20-workflow-syntax.md#evaluate) with [environment variables](../50-environment.md#built-in-environment-variables).)
-- `manual`: A manual event is triggered when a user manually triggers a pipeline.
-- `cron`: A cron event is triggered when a cron job is executed.
-
## Conventions
Sometimes there are multiple terms that can be used to describe something. This section lists the preferred terms to use in Woodpecker:
@@ -54,6 +44,7 @@ Sometimes there are multiple terms that can be used to describe something. This
+[Event]: ../20-workflow-syntax.md#event
[Pipeline]: ../20-workflow-syntax.md
[Workflow]: ../25-workflows.md
[Forge]: ../../30-administration/11-forges/11-overview.md
diff --git a/docs/docs/20-usage/20-workflow-syntax.md b/docs/docs/20-usage/20-workflow-syntax.md
index ab4409b56..15c57b36c 100644
--- a/docs/docs/20-usage/20-workflow-syntax.md
+++ b/docs/docs/20-usage/20-workflow-syntax.md
@@ -104,7 +104,7 @@ When using the `local` backend, the `image` entry is used to specify the shell,
- go test
- name: publish
-+ image: plugins/docker
++ image: woodpeckerci/plugin-kaniko
repo: foo/bar
services:
@@ -190,12 +190,6 @@ Woodpecker provides the ability to pass environment variables to individual step
For more details, check the [environment docs](./50-environment.md).
-### `secrets`
-
-Woodpecker provides the ability to store named parameters external to the YAML configuration file, in a central secret store. These secrets can be passed to individual steps of the workflow at runtime.
-
-For more details, check the [secrets docs](./40-secrets.md).
-
### `failure`
Some of the steps may be allowed to fail without causing the whole workflow and therefore pipeline to report a failure (e.g., a step executing a linting check). To enable this, add `failure: ignore` to your step. If Woodpecker encounters an error while executing the step, it will report it as failed but still executes the next steps of the workflow, if any, without affecting the status of the workflow.
@@ -299,7 +293,16 @@ when:
#### `event`
-Available events: `push`, `pull_request`, `pull_request_closed`, `tag`, `release`, `deployment`, `cron`, `manual`
+The available events are:
+
+- `push`: triggered when a commit is pushed to a branch.
+- `pull_request`: triggered when a pull request is opened or a new commit is pushed to it.
+- `pull_request_closed`: triggered when a pull request is closed or merged.
+- `tag`: triggered when a tag is pushed.
+- `release`: triggered when a release, pre-release or draft is created. (You can apply further filters using [evaluate](#evaluate) with [environment variables](./50-environment.md#built-in-environment-variables).)
+- `deployment` (only available for GitHub): triggered when a deployment is created in the repository.
+- `cron`: triggered when a cron job is executed.
+- `manual`: triggered when a user manually triggers a pipeline.
Execute a step if the build event is a `tag`:
@@ -486,7 +489,7 @@ Normally steps of a workflow are executed serially in the order in which they ar
- go build
- name: deploy
- image: plugins/docker
+ image: woodpeckerci/plugin-kaniko
settings:
repo: foo/bar
+ depends_on: [build, test] # deploy will be executed after build and test finished
@@ -612,7 +615,7 @@ For more details check the [matrix build docs](./30-matrix-workflows.md).
You can set labels for your workflow to select an agent to execute the workflow on. An agent will pick up and run a workflow when **every** label assigned to it matches the agents labels.
-To set additional agent labels, check the [agent configuration options](../30-administration/15-agent-config.md#woodpecker_filter_labels). Agents will have at least four default labels: `platform=agent-os/agent-arch`, `hostname=my-agent`, `backend=docker` (type of the agent backend) and `repo=*`. Agents can use a `*` as a wildcard for a label. For example `repo=*` will match every repo.
+To set additional agent labels, check the [agent configuration options](../30-administration/15-agent-config.md#woodpecker_agent_labels). Agents will have at least four default labels: `platform=agent-os/agent-arch`, `hostname=my-agent`, `backend=docker` (type of the agent backend) and `repo=*`. Agents can use a `*` as a wildcard for a label. For example `repo=*` will match every repo.
Workflow labels with an empty value will be ignored.
By default, each workflow has at least the `repo=your-user/your-repo-name` label. If you have set the [platform attribute](#platform) for your workflow it will have a label like `platform=your-os/your-arch` as well.
diff --git a/docs/docs/20-usage/25-workflows.md b/docs/docs/20-usage/25-workflows.md
index 5adc39f85..ef09d485e 100644
--- a/docs/docs/20-usage/25-workflows.md
+++ b/docs/docs/20-usage/25-workflows.md
@@ -23,13 +23,13 @@ If you still need to pass artifacts between the workflows you need use some stor
```bash
.woodpecker/
-├── .build.yaml
-├── .deploy.yaml
-├── .lint.yaml
-└── .test.yaml
+├── build.yaml
+├── deploy.yaml
+├── lint.yaml
+└── test.yaml
```
-```yaml title=".woodpecker/.build.yaml"
+```yaml title=".woodpecker/build.yaml"
steps:
- name: build
image: debian:stable-slim
@@ -38,7 +38,7 @@ steps:
- sleep 5
```
-```yaml title=".woodpecker/.deploy.yaml"
+```yaml title=".woodpecker/deploy.yaml"
steps:
- name: deploy
image: debian:stable-slim
@@ -51,7 +51,7 @@ depends_on:
- test
```
-```yaml title=".woodpecker/.test.yaml"
+```yaml title=".woodpecker/test.yaml"
steps:
- name: test
image: debian:stable-slim
@@ -63,7 +63,7 @@ depends_on:
- build
```
-```yaml title=".woodpecker/.lint.yaml"
+```yaml title=".woodpecker/lint.yaml"
steps:
- name: lint
image: debian:stable-slim
diff --git a/docs/docs/20-usage/40-secrets.md b/docs/docs/20-usage/40-secrets.md
index 81811daeb..2c7065815 100644
--- a/docs/docs/20-usage/40-secrets.md
+++ b/docs/docs/20-usage/40-secrets.md
@@ -11,26 +11,7 @@ Woodpecker provides three different levels to add secrets to your pipeline. The
## Usage
-### Use secrets in commands
-
-Secrets are exposed to your pipeline steps and plugins as uppercase environment variables and can therefore be referenced in the commands section of your pipeline,
-once their usage is declared in the `secrets` section:
-
-```diff
- steps:
- - name: docker
- image: docker
- commands:
-+ - echo $docker_username
-+ - echo $DOCKER_PASSWORD
-+ secrets: [ docker_username, DOCKER_PASSWORD ]
-```
-
-The case of the environment variables is not changed, but secret matching is done case-insensitively. In the example above, `DOCKER_PASSWORD` would also match if the secret is called `docker_password`.
-
-### Use secrets in settings and environment
-
-You can set an setting or environment value from secrets using the `from_secret` syntax.
+You can set a setting or an environment value from secrets using the `from_secret` syntax.
In this example, the secret named `secret_token` would be passed to the setting named `token`,which will be available in the plugin as environment variable named `PLUGIN_TOKEN` (See [plugins](./51-plugins/20-creating-plugins.md#settings) for details), and to the environment variable `TOKEN_ENV`.
@@ -55,11 +36,11 @@ Please note parameter expressions are subject to pre-processing. When using secr
- name: docker
image: docker
commands:
-- - echo ${docker_username}
-- - echo ${DOCKER_PASSWORD}
-+ - echo $${docker_username}
-+ - echo $${DOCKER_PASSWORD}
- secrets: [ docker_username, DOCKER_PASSWORD ]
+- - echo ${TOKEN_ENV}
++ - echo $${TOKEN_ENV}
+ environment:
+ TOKEN_ENV:
+ from_secret: secret_token
```
### Use in Pull Requests events
@@ -70,9 +51,16 @@ Secrets are not exposed to pull requests by default. You can override this behav
Please be careful when exposing secrets to pull requests. If your repository is open source and accepts pull requests your secrets are not safe. A bad actor can submit a malicious pull request that exposes your secrets.
:::
-## Image filter
+## Plugins filter
-To prevent abusing your secrets from malicious usage, you can limit a secret to a list of images. If enabled they are not available to any other plugin (steps without user-defined commands). If you or an attacker defines explicit commands, the secrets will not be available to the container to prevent leaking them.
+To prevent abusing your secrets from malicious usage, you can limit a secret to a list of plugins. If enabled they are not available to any other plugin (steps without user-defined commands). If you or an attacker defines explicit commands, the secrets will not be available to the container to prevent leaking them.
+
+:::note
+If you specify a tag, the filter will respect it.
+Just make sure you don't specify the same image without one, otherwise it will be ignored again.
+:::
+
+![plugins filter](./secrets-plugins-filter.png)
## Adding Secrets
diff --git a/docs/docs/20-usage/41-registries.md b/docs/docs/20-usage/41-registries.md
index 7cbcc3138..a8aab8b33 100644
--- a/docs/docs/20-usage/41-registries.md
+++ b/docs/docs/20-usage/41-registries.md
@@ -35,10 +35,6 @@ Example registry hostname matching logic:
- Hostname `docker.io` matches `bradrydzewski/golang`
- Hostname `docker.io` matches `bradrydzewski/golang:latest`
-:::note
-The flow above doesn't work in Kubernetes. There is [workaround](../30-administration/22-backends/40-kubernetes.md#images-from-private-registries).
-:::
-
## Global registry support
To make a private registry globally available, check the [server configuration docs](../30-administration/10-server-config.md#global-registry-setting).
diff --git a/docs/docs/20-usage/45-cron.md b/docs/docs/20-usage/45-cron.md
index 95ee8202e..2cb088122 100644
--- a/docs/docs/20-usage/45-cron.md
+++ b/docs/docs/20-usage/45-cron.md
@@ -23,12 +23,6 @@ To configure cron jobs you need at least push access to the repository.
![cron settings](./cron-settings.png)
- The supported schedule syntax can be found at . If you need general understanding of the cron syntax is a good place to start and experiment.
+ The supported schedule syntax can be found at . If you need general understanding of the cron syntax is a good place to start and experiment.
- Examples: `@every 5m`, `@daily`, `0 30 * * * *` ...
-
- :::info
- Woodpeckers cron syntax starts with seconds instead of minutes as used by most linux cron schedulers.
-
- Example: "At minute 30 every hour" would be `0 30 * * * *` instead of `30 * * * *`
- :::
+ Examples: `@every 5m`, `@daily`, `30 * * * *` ...
diff --git a/docs/docs/20-usage/50-environment.md b/docs/docs/20-usage/50-environment.md
index 299bb8f53..9f6bd75e7 100644
--- a/docs/docs/20-usage/50-environment.md
+++ b/docs/docs/20-usage/50-environment.md
@@ -48,97 +48,95 @@ Please note that the environment section is not able to expand environment varia
This is the reference list of all environment variables available to your pipeline containers. These are injected into your pipeline step and plugins containers, at runtime.
-| NAME | Description |
-| -------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
-| `CI` | CI environment name (value: `woodpecker`) |
-| | **Repository** |
-| `CI_REPO` | repository full name `/` |
-| `CI_REPO_OWNER` | repository owner |
-| `CI_REPO_NAME` | repository name |
-| `CI_REPO_REMOTE_ID` | repository remote ID, is the UID it has in the forge |
-| `CI_REPO_SCM` | repository SCM (git) |
-| `CI_REPO_URL` | repository web URL |
-| `CI_REPO_CLONE_URL` | repository clone URL |
-| `CI_REPO_CLONE_SSH_URL` | repository SSH clone URL |
-| `CI_REPO_DEFAULT_BRANCH` | repository default branch (main) |
-| `CI_REPO_PRIVATE` | repository is private |
-| `CI_REPO_TRUSTED` | repository is trusted |
-| | **Current Commit** |
-| `CI_COMMIT_SHA` | commit SHA |
-| `CI_COMMIT_REF` | commit ref |
-| `CI_COMMIT_REFSPEC` | commit ref spec |
-| `CI_COMMIT_BRANCH` | commit branch (equals target branch for pull requests) |
-| `CI_COMMIT_SOURCE_BRANCH` | commit source branch (empty if event is not `pull_request` or `pull_request_closed`) |
-| `CI_COMMIT_TARGET_BRANCH` | commit target branch (empty if event is not `pull_request` or `pull_request_closed`) |
-| `CI_COMMIT_TAG` | commit tag name (empty if event is not `tag`) |
-| `CI_COMMIT_PULL_REQUEST` | commit pull request number (empty if event is not `pull_request` or `pull_request_closed`) |
-| `CI_COMMIT_PULL_REQUEST_LABELS` | labels assigned to pull request (empty if event is not `pull_request` or `pull_request_closed`) |
-| `CI_COMMIT_MESSAGE` | commit message |
-| `CI_COMMIT_AUTHOR` | commit author username |
-| `CI_COMMIT_AUTHOR_EMAIL` | commit author email address |
-| `CI_COMMIT_AUTHOR_AVATAR` | commit author avatar |
-| `CI_COMMIT_PRERELEASE` | release is a pre-release (empty if event is not `release`) |
-| | **Current pipeline** |
-| `CI_PIPELINE_NUMBER` | pipeline number |
-| `CI_PIPELINE_PARENT` | number of parent pipeline |
-| `CI_PIPELINE_EVENT` | pipeline event (see [pipeline events](../20-usage/15-terminology/index.md#pipeline-events)) |
-| `CI_PIPELINE_URL` | link to the web UI for the pipeline |
-| `CI_PIPELINE_FORGE_URL` | link to the forge's web UI for the commit(s) or tag that triggered the pipeline |
-| `CI_PIPELINE_DEPLOY_TARGET` | pipeline deploy target for `deployment` events (i.e. production) |
-| `CI_PIPELINE_DEPLOY_TASK` | pipeline deploy task for `deployment` events (i.e. migration) |
-| `CI_PIPELINE_STATUS` | pipeline status (success, failure) |
-| `CI_PIPELINE_CREATED` | pipeline created UNIX timestamp |
-| `CI_PIPELINE_STARTED` | pipeline started UNIX timestamp |
-| `CI_PIPELINE_FINISHED` | pipeline finished UNIX timestamp |
-| `CI_PIPELINE_FILES` | changed files (empty if event is not `push` or `pull_request`), it is undefined if more than 500 files are touched |
-| | **Current workflow** |
-| `CI_WORKFLOW_NAME` | workflow name |
-| | **Current step** |
-| `CI_STEP_NAME` | step name |
-| `CI_STEP_NUMBER` | step number |
-| `CI_STEP_STATUS` | step status (success, failure) |
-| `CI_STEP_STARTED` | step started UNIX timestamp |
-| `CI_STEP_FINISHED` | step finished UNIX timestamp |
-| `CI_STEP_URL` | URL to step in UI |
-| | **Previous commit** |
-| `CI_PREV_COMMIT_SHA` | previous commit SHA |
-| `CI_PREV_COMMIT_REF` | previous commit ref |
-| `CI_PREV_COMMIT_REFSPEC` | previous commit ref spec |
-| `CI_PREV_COMMIT_BRANCH` | previous commit branch |
-| `CI_PREV_COMMIT_SOURCE_BRANCH` | previous commit source branch |
-| `CI_PREV_COMMIT_TARGET_BRANCH` | previous commit target branch |
-| `CI_PREV_COMMIT_URL` | previous commit link in forge |
-| `CI_PREV_COMMIT_MESSAGE` | previous commit message |
-| `CI_PREV_COMMIT_AUTHOR` | previous commit author username |
-| `CI_PREV_COMMIT_AUTHOR_EMAIL` | previous commit author email address |
-| `CI_PREV_COMMIT_AUTHOR_AVATAR` | previous commit author avatar |
-| | **Previous pipeline** |
-| `CI_PREV_PIPELINE_NUMBER` | previous pipeline number |
-| `CI_PREV_PIPELINE_PARENT` | previous pipeline number of parent pipeline |
-| `CI_PREV_PIPELINE_EVENT` | previous pipeline event (see [pipeline events](../20-usage/15-terminology/index.md#pipeline-events)) |
-| `CI_PREV_PIPELINE_URL` | previous pipeline link in CI |
-| `CI_PREV_PIPELINE_FORGE_URL` | previous pipeline link to event in forge |
-| `CI_PREV_PIPELINE_DEPLOY_TARGET` | previous pipeline deploy target for `deployment` events (ie production) |
-| `CI_PREV_PIPELINE_DEPLOY_TASK` | previous pipeline deploy task for `deployment` events (ie migration) |
-| `CI_PREV_PIPELINE_STATUS` | previous pipeline status (success, failure) |
-| `CI_PREV_PIPELINE_CREATED` | previous pipeline created UNIX timestamp |
-| `CI_PREV_PIPELINE_STARTED` | previous pipeline started UNIX timestamp |
-| `CI_PREV_PIPELINE_FINISHED` | previous pipeline finished UNIX timestamp |
-| | |
-| `CI_WORKSPACE` | Path of the workspace where source code gets cloned to |
-| | **System** |
-| `CI_SYSTEM_NAME` | name of the CI system: `woodpecker` |
-| `CI_SYSTEM_URL` | link to CI system |
-| `CI_SYSTEM_HOST` | hostname of CI server |
-| `CI_SYSTEM_VERSION` | version of the server |
-| | **Forge** |
-| `CI_FORGE_TYPE` | name of forge (gitea, github, ...) |
-| `CI_FORGE_URL` | root URL of configured forge |
-| | **Internal** - Please don't use! |
-| `CI_SCRIPT` | Internal script path. Used to call pipeline step commands. |
-| `CI_NETRC_USERNAME` | Credentials for private repos to be able to clone data. (Only available for specific images) |
-| `CI_NETRC_PASSWORD` | Credentials for private repos to be able to clone data. (Only available for specific images) |
-| `CI_NETRC_MACHINE` | Credentials for private repos to be able to clone data. (Only available for specific images) |
+| NAME | Description | Example |
+| -------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
+| `CI` | CI environment name | `woodpecker` |
+| | **Repository** | |
+| `CI_REPO` | repository full name `/` | `john-doe/my-repo` |
+| `CI_REPO_OWNER` | repository owner | `john-doe` |
+| `CI_REPO_NAME` | repository name | `my-repo` |
+| `CI_REPO_REMOTE_ID` | repository remote ID, is the UID it has in the forge | `82` |
+| `CI_REPO_SCM` | repository SCM | `git` |
+| `CI_REPO_URL` | repository web URL | `https://git.example.com/john-doe/my-repo` |
+| `CI_REPO_CLONE_URL` | repository clone URL | `https://git.example.com/john-doe/my-repo.git` |
+| `CI_REPO_CLONE_SSH_URL` | repository SSH clone URL | `git@git.example.com:john-doe/my-repo.git` |
+| `CI_REPO_DEFAULT_BRANCH` | repository default branch | `main` |
+| `CI_REPO_PRIVATE` | repository is private | `true` |
+| `CI_REPO_TRUSTED_NETWORK` | repository has trusted network access | `false` |
+| `CI_REPO_TRUSTED_VOLUMES` | repository has trusted volumes access | `false` |
+| `CI_REPO_TRUSTED_SECURITY` | repository has trusted security access | `false` |
+| | **Current Commit** | |
+| `CI_COMMIT_SHA` | commit SHA | `eba09b46064473a1d345da7abf28b477468e8dbd` |
+| `CI_COMMIT_REF` | commit ref | `refs/heads/main` |
+| `CI_COMMIT_REFSPEC` | commit ref spec | `issue-branch:main` |
+| `CI_COMMIT_BRANCH` | commit branch (equals target branch for pull requests) | `main` |
+| `CI_COMMIT_SOURCE_BRANCH` | commit source branch (empty if event is not `pull_request` or `pull_request_closed`) | `issue-branch` |
+| `CI_COMMIT_TARGET_BRANCH` | commit target branch (empty if event is not `pull_request` or `pull_request_closed`) | `main` |
+| `CI_COMMIT_TAG` | commit tag name (empty if event is not `tag`) | `v1.10.3` |
+| `CI_COMMIT_PULL_REQUEST` | commit pull request number (empty if event is not `pull_request` or `pull_request_closed`) | `1` |
+| `CI_COMMIT_PULL_REQUEST_LABELS` | labels assigned to pull request (empty if event is not `pull_request` or `pull_request_closed`) | `server` |
+| `CI_COMMIT_MESSAGE` | commit message | `Initial commit` |
+| `CI_COMMIT_AUTHOR` | commit author username | `john-doe` |
+| `CI_COMMIT_AUTHOR_EMAIL` | commit author email address | `john-doe@example.com` |
+| `CI_COMMIT_AUTHOR_AVATAR` | commit author avatar | `https://git.example.com/avatars/5dcbcadbce6f87f8abef` |
+| `CI_COMMIT_PRERELEASE` | release is a pre-release (empty if event is not `release`) | `false` |
+| | **Current pipeline** | |
+| `CI_PIPELINE_NUMBER` | pipeline number | `8` |
+| `CI_PIPELINE_PARENT` | number of parent pipeline | `0` |
+| `CI_PIPELINE_EVENT` | pipeline event (see [`event`](../20-usage/20-workflow-syntax.md#event)) | `push`, `pull_request`, `pull_request_closed`, `tag`, `release`, `manual`, `cron` |
+| `CI_PIPELINE_URL` | link to the web UI for the pipeline | `https://ci.example.com/repos/7/pipeline/8` |
+| `CI_PIPELINE_FORGE_URL` | link to the forge's web UI for the commit(s) or tag that triggered the pipeline | `https://git.example.com/john-doe/my-repo/commit/eba09b46064473a1d345da7abf28b477468e8dbd` |
+| `CI_PIPELINE_DEPLOY_TARGET` | pipeline deploy target for `deployment` events | `production` |
+| `CI_PIPELINE_DEPLOY_TASK` | pipeline deploy task for `deployment` events | `migration` |
+| `CI_PIPELINE_CREATED` | pipeline created UNIX timestamp | `1722617519` |
+| `CI_PIPELINE_STARTED` | pipeline started UNIX timestamp | `1722617519` |
+| `CI_PIPELINE_FILES` | changed files (empty if event is not `push` or `pull_request`), it is undefined if more than 500 files are touched | `[]`, `[".woodpecker.yml","README.md"]` |
+| | **Current workflow** | |
+| `CI_WORKFLOW_NAME` | workflow name | `release` |
+| | **Current step** | |
+| `CI_STEP_NAME` | step name | `build package` |
+| `CI_STEP_NUMBER` | step number | `0` |
+| `CI_STEP_STARTED` | step started UNIX timestamp | `1722617519` |
+| `CI_STEP_URL` | URL to step in UI | `https://ci.example.com/repos/7/pipeline/8` |
+| | **Previous commit** | |
+| `CI_PREV_COMMIT_SHA` | previous commit SHA | `15784117e4e103f36cba75a9e29da48046eb82c4` |
+| `CI_PREV_COMMIT_REF` | previous commit ref | `refs/heads/main` |
+| `CI_PREV_COMMIT_REFSPEC` | previous commit ref spec | `issue-branch:main` |
+| `CI_PREV_COMMIT_BRANCH` | previous commit branch | `main` |
+| `CI_PREV_COMMIT_SOURCE_BRANCH` | previous commit source branch | `issue-branch` |
+| `CI_PREV_COMMIT_TARGET_BRANCH` | previous commit target branch | `main` |
+| `CI_PREV_COMMIT_URL` | previous commit link in forge | `https://git.example.com/john-doe/my-repo/commit/15784117e4e103f36cba75a9e29da48046eb82c4` |
+| `CI_PREV_COMMIT_MESSAGE` | previous commit message | `test` |
+| `CI_PREV_COMMIT_AUTHOR` | previous commit author username | `john-doe` |
+| `CI_PREV_COMMIT_AUTHOR_EMAIL` | previous commit author email address | `john-doe@example.com` |
+| `CI_PREV_COMMIT_AUTHOR_AVATAR` | previous commit author avatar | `https://git.example.com/avatars/12` |
+| | **Previous pipeline** | |
+| `CI_PREV_PIPELINE_NUMBER` | previous pipeline number | `7` |
+| `CI_PREV_PIPELINE_PARENT` | previous pipeline number of parent pipeline | `0` |
+| `CI_PREV_PIPELINE_EVENT` | previous pipeline event (see [`event`](../20-usage/20-workflow-syntax.md#event)) | `push`, `pull_request`, `pull_request_closed`, `tag`, `release`, `manual`, `cron` |
+| `CI_PREV_PIPELINE_URL` | previous pipeline link in CI | `https://ci.example.com/repos/7/pipeline/7` |
+| `CI_PREV_PIPELINE_FORGE_URL` | previous pipeline link to event in forge | `https://git.example.com/john-doe/my-repo/commit/15784117e4e103f36cba75a9e29da48046eb82c4` |
+| `CI_PREV_PIPELINE_DEPLOY_TARGET` | previous pipeline deploy target for `deployment` events | `production` |
+| `CI_PREV_PIPELINE_DEPLOY_TASK` | previous pipeline deploy task for `deployment` events | `migration` |
+| `CI_PREV_PIPELINE_STATUS` | previous pipeline status | `success`, `failure` |
+| `CI_PREV_PIPELINE_CREATED` | previous pipeline created UNIX timestamp | `1722610173` |
+| `CI_PREV_PIPELINE_STARTED` | previous pipeline started UNIX timestamp | `1722610173` |
+| `CI_PREV_PIPELINE_FINISHED` | previous pipeline finished UNIX timestamp | `1722610383` |
+| | | |
+| `CI_WORKSPACE` | Path of the workspace where source code gets cloned to | `/woodpecker/src/git.example.com/john-doe/my-repo` |
+| | **System** | |
+| `CI_SYSTEM_NAME` | name of the CI system | `woodpecker` |
+| `CI_SYSTEM_URL` | link to CI system | `https://ci.example.com` |
+| `CI_SYSTEM_HOST` | hostname of CI server | `ci.example.com` |
+| `CI_SYSTEM_VERSION` | version of the server | `2.7.0` |
+| | **Forge** | |
+| `CI_FORGE_TYPE` | name of forge | `bitbucket` , `bitbucket_dc` , `forgejo` , `gitea` , `github` , `gitlab` |
+| `CI_FORGE_URL` | root URL of configured forge | `https://git.example.com` |
+| | **Internal** - Please don't use! | |
+| `CI_SCRIPT` | Internal script path. Used to call pipeline step commands. | |
+| `CI_NETRC_USERNAME` | Credentials for private repos to be able to clone data. (Only available for specific images) | |
+| `CI_NETRC_PASSWORD` | Credentials for private repos to be able to clone data. (Only available for specific images) | |
+| `CI_NETRC_MACHINE` | Credentials for private repos to be able to clone data. (Only available for specific images) | |
## Global environment variables
@@ -172,7 +170,7 @@ Example commit substitution:
```diff
steps:
- name: docker
- image: plugins/docker
+ image: woodpeckerci/plugin-kaniko
settings:
+ tags: ${CI_COMMIT_SHA}
```
@@ -182,7 +180,7 @@ Example tag substitution:
```diff
steps:
- name: docker
- image: plugins/docker
+ image: woodpeckerci/plugin-kaniko
settings:
+ tags: ${CI_COMMIT_TAG}
```
@@ -210,7 +208,7 @@ Example variable substitution with substring:
```diff
steps:
- name: docker
- image: plugins/docker
+ image: woodpeckerci/plugin-kaniko
settings:
+ tags: ${CI_COMMIT_SHA:0:8}
```
@@ -220,7 +218,7 @@ Example variable substitution strips `v` prefix from `v.1.0.0`:
```diff
steps:
- name: docker
- image: plugins/docker
+ image: woodpeckerci/plugin-kaniko
settings:
+ tags: ${CI_COMMIT_TAG##v}
```
diff --git a/docs/docs/20-usage/51-plugins/20-creating-plugins.md b/docs/docs/20-usage/51-plugins/20-creating-plugins.md
index c09a6226d..4591a1d1a 100644
--- a/docs/docs/20-usage/51-plugins/20-creating-plugins.md
+++ b/docs/docs/20-usage/51-plugins/20-creating-plugins.md
@@ -42,7 +42,7 @@ Values like this are converted to JSON and then passed to your plugin. In the ex
### Secrets
-Secrets should be passed as settings too. Therefore, users should use [`from_secret`](../40-secrets.md#use-secrets-in-settings-and-environment).
+Secrets should be passed as settings too. Therefore, users should use [`from_secret`](../40-secrets.md#usage).
## Plugin library
diff --git a/docs/docs/20-usage/51-plugins/51-overview.md b/docs/docs/20-usage/51-plugins/51-overview.md
index 6213d5d27..ea43d66e7 100644
--- a/docs/docs/20-usage/51-plugins/51-overview.md
+++ b/docs/docs/20-usage/51-plugins/51-overview.md
@@ -34,7 +34,7 @@ steps:
- go test
- name: publish
- image: plugins/docker
+ image: woodpeckerci/plugin-kaniko
settings:
repo: foo/bar
tags: latest
@@ -50,9 +50,10 @@ steps:
Plugins are just pipeline steps. They share the build workspace, mounted as a volume, and therefore have access to your source tree.
While normal steps are all about arbitrary code execution, plugins should only allow the functions intended by the plugin author.
-So there are a few limitations, like the workspace base is always mounted at `/woodpecker`, but the working directory is dynamically adjusted accordingly. So as user of a plugin you should not have to care about this.
-
-Also instead of using environment variables the plugin should only care about one prefixed with `PLUGIN_` witch are the internal representation of the **settings** ([read more](./20-creating-plugins.md)).
+That's why there are a few limitations. The workspace base is always mounted at `/woodpecker`, but the working directory is dynamically
+adjusted accordingly, as user of a plugin you should not have to care about this. Also, you cannot use the plugin together with `commands`
+or `entrypoint` which will fail. Using `environment` is possible, but in this case, the plugin is internally not treated as plugin
+anymore. The container then cannot access secrets with plugin filter anymore and the containers won't be privileged without explicit definition.
## Finding Plugins
diff --git a/docs/docs/20-usage/secrets-plugins-filter.png b/docs/docs/20-usage/secrets-plugins-filter.png
new file mode 100644
index 000000000..460d852fb
Binary files /dev/null and b/docs/docs/20-usage/secrets-plugins-filter.png differ
diff --git a/docs/docs/30-administration/00-getting-started.md b/docs/docs/30-administration/00-getting-started.md
index 8bb1b0a71..e5d573e56 100644
--- a/docs/docs/30-administration/00-getting-started.md
+++ b/docs/docs/30-administration/00-getting-started.md
@@ -32,9 +32,9 @@ In addition you need at least some kind of database which requires additional re
## Installation
-You can install Woodpecker on multiple ways. If you are not sure which one to choose, we recommend using the [docker-compose](./05-deployment-methods/10-docker-compose.md) method for the beginning:
+You can install Woodpecker on multiple ways. If you are not sure which one to choose, we recommend using the [docker compose](./05-deployment-methods/10-docker-compose.md) method for the beginning:
-- Using [docker-compose](./05-deployment-methods/10-docker-compose.md) with the official [container images](./05-deployment-methods/10-docker-compose.md#docker-images)
+- Using [docker compose](./05-deployment-methods/10-docker-compose.md) with the official [container images](./05-deployment-methods/10-docker-compose.md#docker-images)
- Using [Kubernetes](./05-deployment-methods/20-kubernetes.md) via the Woodpecker Helm chart
- Using binaries, DEBs or RPMs you can download from [latest release](https://github.com/woodpecker-ci/woodpecker/releases/latest)
- Or using a [third-party installation method](./05-deployment-methods/30-third-party.md)
@@ -55,5 +55,5 @@ Check the [server configuration](./10-server-config.md) and [agent configuration
The agent is the worker which executes the [workflows](../20-usage/15-terminology/index.md).
Woodpecker agents can execute work using a [backend](../20-usage/15-terminology/index.md) like [docker](./22-backends/10-docker.md) or [kubernetes](./22-backends/40-kubernetes.md).
-By default if you choose to deploy an agent using [docker-compose](./05-deployment-methods/10-docker-compose.md) the agent simply use docker for the backend as well.
+By default if you choose to deploy an agent using [docker compose](./05-deployment-methods/10-docker-compose.md) the agent simply use docker for the backend as well.
So nothing to worry about here. If you still prefer to adjust the agent to your needs, check the [agent configuration](./15-agent-config.md) page.
diff --git a/docs/docs/30-administration/05-deployment-methods/10-docker-compose.md b/docs/docs/30-administration/05-deployment-methods/10-docker-compose.md
index 5af7e85fc..a00353d3a 100644
--- a/docs/docs/30-administration/05-deployment-methods/10-docker-compose.md
+++ b/docs/docs/30-administration/05-deployment-methods/10-docker-compose.md
@@ -1,12 +1,10 @@
-# docker-compose
+# docker compose
-The below [docker-compose](https://docs.docker.com/compose/) configuration can be used to start a Woodpecker server with a single agent.
+The below [docker compose](https://docs.docker.com/compose/) configuration can be used to start a Woodpecker server with a single agent.
-It relies on a number of environment variables that you must set before running `docker-compose up`. The variables are described below.
+It relies on a number of environment variables that you must set before running `docker compose up`. The variables are described below.
```yaml title="docker-compose.yaml"
-version: '3'
-
services:
woodpecker-server:
image: woodpeckerci/woodpecker-server:latest
@@ -43,8 +41,6 @@ volumes:
Woodpecker needs to know its own address. You must therefore provide the public address of it in `://` format. Please omit trailing slashes:
```diff title="docker-compose.yaml"
- version: '3'
-
services:
woodpecker-server:
[...]
@@ -53,11 +49,10 @@ Woodpecker needs to know its own address. You must therefore provide the public
+ - WOODPECKER_HOST=${WOODPECKER_HOST}
```
-Woodpecker can also have its port's configured. It uses a separate port for gRPC and for HTTP. The agent performs gRPC calls and connects to the gRPC port.
+Woodpecker can also have its ports configured. It uses a separate port for gRPC and for HTTP. The agent performs gRPC calls and connects to the gRPC port.
They can be configured with `*_ADDR` variables:
```diff title="docker-compose.yaml"
- version: '3'
services:
woodpecker-server:
[...]
@@ -70,7 +65,6 @@ They can be configured with `*_ADDR` variables:
Reverse proxying can also be [configured for gRPC](../40-advanced/10-proxy.md#caddy). If the agents are connecting over the internet, it should also be SSL encrypted. The agent then needs to be configured to be secure:
```diff title="docker-compose.yaml"
- version: '3'
services:
woodpecker-server:
[...]
@@ -83,8 +77,6 @@ Reverse proxying can also be [configured for gRPC](../40-advanced/10-proxy.md#ca
As agents run pipeline steps as docker containers they require access to the host machine's Docker daemon:
```diff title="docker-compose.yaml"
- version: '3'
-
services:
[...]
woodpecker-agent:
@@ -96,8 +88,6 @@ As agents run pipeline steps as docker containers they require access to the hos
Agents require the server address for agent-to-server communication. The agent connects to the server's gRPC port:
```diff title="docker-compose.yaml"
- version: '3'
-
services:
woodpecker-agent:
[...]
@@ -108,8 +98,6 @@ Agents require the server address for agent-to-server communication. The agent c
The server and agents use a shared secret to authenticate communication. This should be a random string of your choosing and should be kept private. You can generate such string with `openssl rand -hex 32`:
```diff title="docker-compose.yaml"
- version: '3'
-
services:
woodpecker-server:
[...]
diff --git a/docs/docs/30-administration/05-deployment-methods/30-third-party.md b/docs/docs/30-administration/05-deployment-methods/30-third-party.md
index acad9c0fd..8eabded39 100644
--- a/docs/docs/30-administration/05-deployment-methods/30-third-party.md
+++ b/docs/docs/30-administration/05-deployment-methods/30-third-party.md
@@ -1,12 +1,12 @@
-# Third-party installation methods
+# Distribution packages
:::info
-These installation methods are not officially supported. If you experience issues with them, please open issues in the specific repositories.
+Woodpecker itself is not responsible for creating these packages. Please reach out to the people responsible for packaging Woodpecker for the individual distributions.
:::
-- [Using NixOS](./40-nixos.md) via the [NixOS module](https://search.nixos.org/options?channel=unstable&size=200&sort=relevance&query=woodpecker)
-- [On Alpine Edge](https://pkgs.alpinelinux.org/packages?name=woodpecker&branch=edge&repo=&arch=&maintainer=)
-- [On Arch Linux](https://archlinux.org/packages/?q=woodpecker)
-- [On openSUSE](https://software.opensuse.org/package/woodpecker)
-- [Using YunoHost](https://apps.yunohost.org/app/woodpecker)
-- [On Cloudron](https://www.cloudron.io/store/org.woodpecker_ci.cloudronapp.html)
+- [NixOS](./40-nixos.md) via the [NixOS module](https://search.nixos.org/options?channel=unstable&size=200&sort=relevance&query=woodpecker)
+- [Alpine (Edge)](https://pkgs.alpinelinux.org/packages?name=woodpecker&branch=edge&repo=&arch=&maintainer=)
+- [Arch Linux](https://archlinux.org/packages/?q=woodpecker)
+- [openSUSE](https://software.opensuse.org/package/woodpecker)
+- [YunoHost](https://apps.yunohost.org/app/woodpecker)
+- [Cloudron](https://www.cloudron.io/store/org.woodpecker_ci.cloudronapp.html)
diff --git a/docs/docs/30-administration/05-deployment-methods/40-nixos.md b/docs/docs/30-administration/05-deployment-methods/40-nixos.md
index b599b7021..063016985 100644
--- a/docs/docs/30-administration/05-deployment-methods/40-nixos.md
+++ b/docs/docs/30-administration/05-deployment-methods/40-nixos.md
@@ -87,4 +87,4 @@ All configuration options can be found via [NixOS Search](https://search.nixos.o
## Tips and tricks
-There are some resources on how to utilize Woodpecker more effectively with NixOS on the [Awesome Woodpecker](../../92-awesome.md) page, like using the runners nix-store in the pipeline.
+There are some resources on how to utilize Woodpecker more effectively with NixOS on the [Awesome Woodpecker](/awesome) page, like using the runners nix-store in the pipeline.
diff --git a/docs/docs/30-administration/10-database.md b/docs/docs/30-administration/10-database.md
index e3e33ba7d..b1b5aa688 100644
--- a/docs/docs/30-administration/10-database.md
+++ b/docs/docs/30-administration/10-database.md
@@ -7,8 +7,6 @@ The default database engine of Woodpecker is an embedded SQLite database which r
By default Woodpecker uses a SQLite database stored under `/var/lib/woodpecker/`. If using containers, you can mount a [data volume](https://docs.docker.com/storage/volumes/#create-and-manage-volumes) to persist the SQLite database.
```diff title="docker-compose.yaml"
- version: '3'
-
services:
woodpecker-server:
[...]
diff --git a/docs/docs/30-administration/10-server-config.md b/docs/docs/30-administration/10-server-config.md
index 6e7e450a5..17da7abd2 100644
--- a/docs/docs/30-administration/10-server-config.md
+++ b/docs/docs/30-administration/10-server-config.md
@@ -63,17 +63,15 @@ Point it to your server's docker config.
WOODPECKER_DOCKER_CONFIG=/root/.docker/config.json
```
-## Handling sensitive data in docker-compose and docker-swarm
+## Handling sensitive data in **docker compose** and **docker swarm**
-To handle sensitive data in docker-compose or docker-swarm configurations there are several options:
+To handle sensitive data in `docker compose` or `docker swarm` configurations there are several options:
-For docker-compose you can use a `.env` file next to your compose configuration to store the secrets outside of the compose file. While this separates configuration from secrets it is still not very secure.
+For docker compose you can use a `.env` file next to your compose configuration to store the secrets outside of the compose file. While this separates configuration from secrets it is still not very secure.
Alternatively use docker-secrets. As it may be difficult to use docker secrets for environment variables Woodpecker allows to read sensible data from files by providing a `*_FILE` option of all sensible configuration variables. Woodpecker will try to read the value directly from this file. Keep in mind that when the original environment variable gets specified at the same time it will override the value read from the file.
```diff title="docker-compose.yaml"
- version: '3'
-
services:
woodpecker-server:
[...]
@@ -161,17 +159,35 @@ Configures the logging level. Possible values are `trace`, `debug`, `info`, `war
Output destination for logs.
'stdout' and 'stderr' can be used as special keywords.
-### `WOODPECKER_LOG_XORM`
+### `WOODPECKER_DATABASE_LOG`
> Default: `false`
-Enable XORM logs.
+Enable logging in database engine (currently xorm).
-### `WOODPECKER_LOG_XORM_SQL`
+### `WOODPECKER_DATABASE_LOG_SQL`
> Default: `false`
-Enable XORM SQL command logs.
+Enable logging of sql commands.
+
+### `WOODPECKER_DATABASE_MAX_CONNECTIONS`
+
+> Default: `100`
+
+Max database connections xorm is allowed create.
+
+### `WOODPECKER_DATABASE_IDLE_CONNECTIONS`
+
+> Default: `2`
+
+Amount of database connections xorm will hold open.
+
+### `WOODPECKER_DATABASE_CONNECTION_TIMEOUT`
+
+> Default: `3 Seconds`
+
+Time an active database connection is allowed to stay open.
### `WOODPECKER_DEBUG_PRETTY`
@@ -197,14 +213,6 @@ Examples:
- `WOODPECKER_HOST=http://example.org/woodpecker`
- `WOODPECKER_HOST=http://example.org:1234/woodpecker`
-### `WOODPECKER_WEBHOOK_HOST`
-
-> Default: value from `WOODPECKER_HOST` config env
-
-Server fully qualified URL of the Webhook-facing hostname and path prefix.
-
-Example: `WOODPECKER_WEBHOOK_HOST=http://woodpecker-server.cicd.svc.cluster.local:8000`
-
### `WOODPECKER_SERVER_ADDR`
> Default: `:8000`
@@ -327,11 +335,13 @@ Always use authentication to clone repositories even if they are public. Needed
List of event names that will be canceled when a new pipeline for the same context (tag, branch) is created.
-### `WOODPECKER_DEFAULT_CLONE_IMAGE`
+### `WOODPECKER_DEFAULT_CLONE_PLUGIN`
> Default is defined in [shared/constant/constant.go](https://github.com/woodpecker-ci/woodpecker/blob/main/shared/constant/constant.go)
-The default docker image to be used when cloning the repo
+The default docker image to be used when cloning the repo.
+
+It is also added to the trusted clone plugin list.
### `WOODPECKER_DEFAULT_PIPELINE_TIMEOUT`
@@ -354,11 +364,20 @@ Context: when someone does log into Woodpecker, a temporary session token is cre
As long as the session is valid (until it expires or log-out),
a user can log into Woodpecker, without re-authentication.
-### `WOODPECKER_ESCALATE`
+### `WOODPECKER_PLUGINS_PRIVILEGED`
+
+Docker images to run in privileged mode. Only change if you are sure what you do!
+
+You should specify the tag of your images too, as this enforces exact matches.
+
+### WOODPECKER_PLUGINS_TRUSTED_CLONE
> Defaults are defined in [shared/constant/constant.go](https://github.com/woodpecker-ci/woodpecker/blob/main/shared/constant/constant.go)
-Docker images to run in privileged mode. Only change if you are sure what you do!
+Plugins which are trusted to handle the netrc info in clone steps.
+If a clone step use an image not in this list, the netrc will not be injected and an user has to use other methods (e.g. secrets) to clone non public repos.
+
+You should specify the tag of your images too, as this enforces exact matches.
```yaml
-version: '3.8'
-
services:
server:
image: woodpeckerci/woodpecker-server:latest
diff --git a/docs/docs/30-administration/40-advanced/100-external-configuration-api.md b/docs/docs/30-administration/40-advanced/100-external-configuration-api.md
index 8ed55baf5..a24abd3bd 100644
--- a/docs/docs/30-administration/40-advanced/100-external-configuration-api.md
+++ b/docs/docs/30-administration/40-advanced/100-external-configuration-api.md
@@ -3,7 +3,7 @@
To provide additional management and preprocessing capabilities for pipeline configurations Woodpecker supports an HTTP API which can be enabled to call an external config service.
Before the run or restart of any pipeline Woodpecker will make a POST request to an external HTTP API sending the current repository, build information and all current config files retrieved from the repository. The external API can then send back new pipeline configurations that will be used immediately or respond with `HTTP 204` to tell the system to use the existing configuration.
-Every request sent by Woodpecker is signed using a [http-signature](https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures) by a private key (ed25519) generated on the first start of the Woodpecker server. You can get the public key for the verification of the http-signature from `http(s)://your-woodpecker-server/api/signature/public-key`.
+Every request sent by Woodpecker is signed using a [http-signature](https://datatracker.ietf.org/doc/html/rfc9421) by a private key (ed25519) generated on the first start of the Woodpecker server. You can get the public key for the verification of the http-signature from `http(s)://your-woodpecker-server/api/signature/public-key`.
A simplistic example configuration service can be found here: [https://github.com/woodpecker-ci/example-config-service](https://github.com/woodpecker-ci/example-config-service)
@@ -81,12 +81,11 @@ WOODPECKER_CONFIG_SERVICE_ENDPOINT=https://example.com/ciconfig
"updated_at": 0,
"verified": false
},
- "configs": [
- {
- "name": ".woodpecker.yaml",
- "data": "steps:\n - name: backend\n image: alpine\n commands:\n - echo \"Hello there from Repo (.woodpecker.yaml)\"\n"
- }
- ]
+ "netrc": {
+ "machine": "https://example.com",
+ "login": "user",
+ "password": "password"
+ }
}
```
diff --git a/docs/docs/30-administration/40-advanced/20-ssl.md b/docs/docs/30-administration/40-advanced/20-ssl.md
index 755ba205d..6fda26d3d 100644
--- a/docs/docs/30-administration/40-advanced/20-ssl.md
+++ b/docs/docs/30-administration/40-advanced/20-ssl.md
@@ -52,8 +52,6 @@ SSL support is provided using the [ListenAndServeTLS](https://golang.org/pkg/net
Update your configuration to expose the following ports:
```diff title="docker-compose.yaml"
- version: '3'
-
services:
woodpecker-server:
[...]
@@ -66,8 +64,6 @@ Update your configuration to expose the following ports:
Update your configuration to mount your certificate and key:
```diff title="docker-compose.yaml"
- version: '3'
-
services:
woodpecker-server:
[...]
@@ -79,8 +75,6 @@ Update your configuration to mount your certificate and key:
Update your configuration to provide the paths of your certificate and key:
```diff title="docker-compose.yaml"
- version: '3'
-
services:
woodpecker-server:
[...]
diff --git a/docs/docs/30-administration/40-advanced/30-autoscaler.md b/docs/docs/30-administration/40-advanced/30-autoscaler.md
index ce9ee914a..0ad43a30b 100644
--- a/docs/docs/30-administration/40-advanced/30-autoscaler.md
+++ b/docs/docs/30-administration/40-advanced/30-autoscaler.md
@@ -6,13 +6,11 @@ Please note that the autoscaler is not feature-complete yet. You can follow the
## Setup
-### docker-compose
+### docker compose
-If you are using docker-compose you can add the following to your `docker-compose.yaml` file:
+If you are using docker compose you can add the following to your `docker-compose.yaml` file:
```yaml
-version: '3'
-
services:
woodpecker-server:
image: woodpeckerci/woodpecker-server:next
diff --git a/docs/docs/92-development/01-getting-started.md b/docs/docs/92-development/01-getting-started.md
index c4aef640d..4d93227c3 100644
--- a/docs/docs/92-development/01-getting-started.md
+++ b/docs/docs/92-development/01-getting-started.md
@@ -54,8 +54,7 @@ A common config for debugging would look like this:
WOODPECKER_OPEN=true
WOODPECKER_ADMIN=your-username
-# if you want to test webhooks with an online forge like GitHub this address needs to be accessible from public server
-WOODPECKER_HOST=http://your-dev-address.com
+WOODPECKER_HOST=http://localhost:8000
# github (sample for a forge config - see /docs/administration/forge/overview for other forges)
WOODPECKER_GITHUB=true
@@ -70,8 +69,8 @@ WOODPECKER_MAX_WORKFLOWS=1
# enable if you want to develop the UI
# WOODPECKER_DEV_WWW_PROXY=http://localhost:8010
-# used so you can login without using a public address
-WOODPECKER_DEV_OAUTH_HOST=http://localhost:8000
+# if you want to test webhooks with an online forge like GitHub this address needs to be set and accessible from public server
+WOODPECKER_EXPERT_WEBHOOK_HOST=http://your-address.com
# disable health-checks while debugging (normally not needed while developing)
WOODPECKER_HEALTHCHECK=false
@@ -82,7 +81,7 @@ WOODPECKER_HEALTHCHECK=false
### Setup OAuth
-Create an OAuth app for your forge as described in the [forges documentation](../30-administration/11-forges/11-overview.md). If you set `WOODPECKER_DEV_OAUTH_HOST=http://localhost:8000` you can use that address with the path as explained for the specific forge to login without the need for a public address. For example for GitHub you would use `http://localhost:8000/authorize` as authorization callback URL.
+Create an OAuth app for your forge as described in the [forges documentation](../30-administration/11-forges/11-overview.md).
## Developing with VS Code
diff --git a/docs/docs/92-development/07-guides.md b/docs/docs/92-development/07-guides.md
index c70a9ec93..124cd4031 100644
--- a/docs/docs/92-development/07-guides.md
+++ b/docs/docs/92-development/07-guides.md
@@ -21,3 +21,49 @@ To automatically execute the migration after the start of the server, the new mi
## Constants of official images
All official default images, are saved in [shared/constant/constant.go](https://github.com/woodpecker-ci/woodpecker/blob/main/shared/constant/constant.go) and must be pinned by an exact tag.
+
+## Building images locally
+
+### Server
+
+```sh
+### build web component
+make vendor
+cd web/
+pnpm install --frozen-lockfile
+pnpm build
+cd ..
+
+### define the platforms to build for (e.g. linux/amd64)
+# (the | is not a typo here)
+export PLATFORMS='linux|amd64'
+make cross-compile-server
+
+### build the image
+docker buildx build --platform linux/amd64 -t username/repo:tag -f docker/Dockerfile.server.multiarch --push .
+```
+
+:::info
+The `cross-compile-server` rule makes use of `xgo`, a go cross-compiler. You need to be on a `amd64` host to do this, as `xgo` is only available for `amd64` (see [xgo#213](https://github.com/techknowlogick/xgo/issues/213)).
+You can try to use the `build-server` rule instead, however this one fails for some OS (e.g. macOS).
+:::
+
+### Agent
+
+```sh
+### build the agent
+make build-agent
+
+### build the image
+docker buildx build --platform linux/amd64 -t username/repo:tag -f docker/Dockerfile.agent.multiarch --push .
+```
+
+### CLI
+
+```sh
+### build the CLI
+make build-cli
+
+### build the image
+docker buildx build --platform linux/amd64 -t username/repo:tag -f docker/Dockerfile.cli.multiarch --push .
+```
diff --git a/docs/docs/pipeline-list.png b/docs/docs/pipeline-list.png
deleted file mode 100644
index f501fe0e6..000000000
Binary files a/docs/docs/pipeline-list.png and /dev/null differ
diff --git a/docs/docs/woodpecker.png b/docs/docs/woodpecker.png
deleted file mode 100644
index b92f3589f..000000000
Binary files a/docs/docs/woodpecker.png and /dev/null differ
diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts
index c1b1e0a8f..8ace2d984 100644
--- a/docs/docusaurus.config.ts
+++ b/docs/docusaurus.config.ts
@@ -5,7 +5,7 @@ import * as path from 'path';
const config: Config = {
title: 'Woodpecker CI',
- tagline: 'Woodpecker is a simple yet powerful CI/CD engine with great extensibility.',
+ tagline: 'Woodpecker is a simple, yet powerful CI/CD engine with great extensibility.',
url: 'https://woodpecker-ci.org',
baseUrl: '/',
onBrokenLinks: 'throw',
@@ -50,13 +50,13 @@ const config: Config = {
position: 'left',
items: [
{
- to: '/docs/next/migrations', // Always point to newest migration guide
- activeBaseRegex: 'docs/(next/)?migrations',
+ to: '/migrations', // Always point to newest migration guide
+ activeBaseRegex: 'migrations',
label: 'Migrations',
},
{
- to: '/docs/next/awesome', // Always point to newest awesome list
- activeBaseRegex: 'docs/(next/)?awesome',
+ to: '/awesome', // Always point to newest awesome list
+ activeBaseRegex: 'awesome',
label: 'Awesome',
},
{
@@ -147,7 +147,7 @@ const config: Config = {
],
},
],
- copyright: `Copyright © ${new Date().getFullYear()} Woodpecker CI. Built with Docusaurus.`,
+ copyright: `Copyright © ${new Date().getFullYear()} Woodpecker Authors. Built with Docusaurus.`,
},
prism: {
theme: themes.github,
@@ -264,6 +264,7 @@ const config: Config = {
blog: {
blogTitle: 'Blog',
blogDescription: 'A blog for release announcements, turorials...',
+ onInlineAuthors: 'ignore',
// postsPerPage: 'ALL',
// blogSidebarCount: 0,
},
diff --git a/docs/package.json b/docs/package.json
index 2d90da6b7..5a8e87a00 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -14,19 +14,19 @@
"write-heading-ids": "docusaurus write-heading-ids"
},
"dependencies": {
- "@docusaurus/core": "^3.1.0",
- "@docusaurus/plugin-content-blog": "^3.1.0",
- "@docusaurus/preset-classic": "^3.1.0",
- "@easyops-cn/docusaurus-search-local": "^0.44.0",
- "@mdx-js/react": "^3.0.0",
+ "@docusaurus/core": "^3.5.2",
+ "@docusaurus/plugin-content-blog": "^3.5.2",
+ "@docusaurus/preset-classic": "^3.5.2",
+ "@easyops-cn/docusaurus-search-local": "^0.45.0",
+ "@mdx-js/react": "^3.1.0",
"@svgr/webpack": "^8.1.0",
- "clsx": "^2.1.0",
- "esbuild-loader": "^4.1.0",
+ "clsx": "^2.1.1",
+ "esbuild-loader": "^4.2.2",
"file-loader": "^6.2.0",
- "prism-react-renderer": "^2.3.1",
+ "prism-react-renderer": "^2.4.0",
"react": "^18.3.1",
- "react-dom": "^18.2.0",
- "redocusaurus": "^2.0.2",
+ "react-dom": "^18.3.1",
+ "redocusaurus": "^2.1.2",
"url-loader": "^4.1.1"
},
"browserslist": {
@@ -42,18 +42,20 @@
]
},
"devDependencies": {
- "@docusaurus/module-type-aliases": "^3.1.0",
- "@docusaurus/tsconfig": "3.4.0",
- "@docusaurus/types": "^3.1.0",
- "@types/node": "^20.11.30",
- "@types/react": "^18.2.67",
+ "@docusaurus/module-type-aliases": "^3.5.2",
+ "@docusaurus/tsconfig": "3.5.2",
+ "@docusaurus/types": "^3.5.2",
+ "@types/node": "^20.17.1",
+ "@types/react": "^18.3.12",
"@types/react-helmet": "^6.1.11",
"@types/react-router-dom": "^5.3.3",
- "typescript": "^5.4.3"
+ "typescript": "^5.6.3"
},
"pnpm": {
"overrides": {
- "got": "^14.0.0"
+ "got": "^14.0.0",
+ "path-to-regexp": "^3.3.0",
+ "cookie": "^1.0.0"
}
}
}
diff --git a/docs/plugins/woodpecker-plugins/package.json b/docs/plugins/woodpecker-plugins/package.json
index 993422e88..44e4ddc05 100644
--- a/docs/plugins/woodpecker-plugins/package.json
+++ b/docs/plugins/woodpecker-plugins/package.json
@@ -16,9 +16,9 @@
"@tsconfig/docusaurus": "^2.0.3",
"@types/node": "^20.12.13",
"axios": "^1.7.2",
- "concurrently": "^8.2.2",
+ "concurrently": "^9.0.0",
"isomorphic-dompurify": "^2.11.0",
- "marked": "^13.0.0",
+ "marked": "^14.0.0",
"tslib": "^2.6.2",
"typescript": "^5.4.5"
},
diff --git a/docs/plugins/woodpecker-plugins/plugins.json b/docs/plugins/woodpecker-plugins/plugins.json
index 775916c7b..af7f55884 100644
--- a/docs/plugins/woodpecker-plugins/plugins.json
+++ b/docs/plugins/woodpecker-plugins/plugins.json
@@ -40,11 +40,6 @@
"docs": "https://raw.githubusercontent.com/woodpecker-ci/plugin-extend-env/main/docs.md",
"verified": true
},
- {
- "name": "Block Git changes",
- "docs": "https://codeberg.org/qwerty287/woodpecker-block-git-changes/raw/branch/main/docs.md",
- "verified": false
- },
{
"name": "Regex check",
"docs": "https://codeberg.org/qwerty287/woodpecker-regex-check/raw/branch/main/docs.md",
@@ -219,6 +214,11 @@
"name": "Docker Tags",
"docs": "https://raw.githubusercontent.com/dvjn/woodpecker-docker-tags-plugin/main/docs.md",
"verified": false
+ },
+ {
+ "name": "Telegram",
+ "docs": "https://raw.githubusercontent.com/appleboy/drone-telegram/refs/heads/master/DOCS.md",
+ "verified": false
}
]
}
diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml
index ffc732879..a91fa59f3 100644
--- a/docs/pnpm-lock.yaml
+++ b/docs/pnpm-lock.yaml
@@ -6,69 +6,71 @@ settings:
overrides:
got: ^14.0.0
+ path-to-regexp: ^3.3.0
+ cookie: ^1.0.0
importers:
.:
dependencies:
'@docusaurus/core':
- specifier: ^3.1.0
- version: 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
+ specifier: ^3.5.2
+ version: 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/plugin-content-blog':
- specifier: ^3.1.0
- version: 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
+ specifier: ^3.5.2
+ version: 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/preset-classic':
- specifier: ^3.1.0
- version: 3.4.0(@algolia/client-search@4.24.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.5.3)
+ specifier: ^3.5.2
+ version: 3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3)
'@easyops-cn/docusaurus-search-local':
- specifier: ^0.44.0
- version: 0.44.2(@docusaurus/theme-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
+ specifier: ^0.45.0
+ version: 0.45.0(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@mdx-js/react':
- specifier: ^3.0.0
- version: 3.0.1(@types/react@18.3.3)(react@18.3.1)
+ specifier: ^3.1.0
+ version: 3.1.0(@types/react@18.3.12)(react@18.3.1)
'@svgr/webpack':
specifier: ^8.1.0
- version: 8.1.0(typescript@5.5.3)
+ version: 8.1.0(typescript@5.6.3)
clsx:
- specifier: ^2.1.0
+ specifier: ^2.1.1
version: 2.1.1
esbuild-loader:
- specifier: ^4.1.0
- version: 4.2.0(webpack@5.92.1)
+ specifier: ^4.2.2
+ version: 4.2.2(webpack@5.95.0)
file-loader:
specifier: ^6.2.0
- version: 6.2.0(webpack@5.92.1)
+ version: 6.2.0(webpack@5.95.0)
prism-react-renderer:
- specifier: ^2.3.1
- version: 2.3.1(react@18.3.1)
+ specifier: ^2.4.0
+ version: 2.4.0(react@18.3.1)
react:
specifier: ^18.3.1
version: 18.3.1
react-dom:
- specifier: ^18.2.0
+ specifier: ^18.3.1
version: 18.3.1(react@18.3.1)
redocusaurus:
- specifier: ^2.0.2
- version: 2.1.1(@docusaurus/theme-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3))(core-js@3.37.1)(enzyme@3.11.0)(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.92.1)
+ specifier: ^2.1.2
+ version: 2.1.2(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3))(core-js@3.38.1)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.95.0)
url-loader:
specifier: ^4.1.1
- version: 4.1.1(file-loader@6.2.0(webpack@5.92.1))(webpack@5.92.1)
+ version: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0)
devDependencies:
'@docusaurus/module-type-aliases':
- specifier: ^3.1.0
- version: 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: ^3.5.2
+ version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/tsconfig':
- specifier: 3.4.0
- version: 3.4.0
+ specifier: 3.5.2
+ version: 3.5.2
'@docusaurus/types':
- specifier: ^3.1.0
- version: 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: ^3.5.2
+ version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/node':
- specifier: ^20.11.30
- version: 20.14.10
+ specifier: ^20.17.1
+ version: 20.17.2
'@types/react':
- specifier: ^18.2.67
- version: 18.3.3
+ specifier: ^18.3.12
+ version: 18.3.12
'@types/react-helmet':
specifier: ^6.1.11
version: 6.1.11
@@ -76,8 +78,8 @@ importers:
specifier: ^5.3.3
version: 5.3.3
typescript:
- specifier: ^5.4.3
- version: 5.5.3
+ specifier: ^5.6.3
+ version: 5.6.3
plugins/woodpecker-plugins:
dependencies:
@@ -92,41 +94,41 @@ importers:
version: 18.3.1(react@18.3.1)
yaml:
specifier: ^2.4.2
- version: 2.4.5
+ version: 2.6.0
devDependencies:
'@docusaurus/module-type-aliases':
specifier: ^3.3.2
- version: 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/theme-classic':
specifier: ^3.3.2
- version: 3.4.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
+ version: 3.5.2(@types/react@18.3.12)(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/types':
specifier: ^3.3.2
- version: 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@tsconfig/docusaurus':
specifier: ^2.0.3
version: 2.0.3
'@types/node':
specifier: ^20.12.13
- version: 20.14.10
+ version: 20.17.2
axios:
specifier: ^1.7.2
- version: 1.7.2
+ version: 1.7.7
concurrently:
- specifier: ^8.2.2
- version: 8.2.2
+ specifier: ^9.0.0
+ version: 9.0.1
isomorphic-dompurify:
specifier: ^2.11.0
- version: 2.12.0
+ version: 2.16.0
marked:
- specifier: ^13.0.0
- version: 13.0.2
+ specifier: ^14.0.0
+ version: 14.1.3
tslib:
specifier: ^2.6.2
- version: 2.6.3
+ version: 2.8.0
typescript:
specifier: ^5.4.5
- version: 5.5.3
+ version: 5.6.3
packages:
@@ -202,42 +204,42 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
- '@babel/code-frame@7.24.7':
- resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
+ '@babel/code-frame@7.26.0':
+ resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==}
engines: {node: '>=6.9.0'}
- '@babel/compat-data@7.24.7':
- resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==}
+ '@babel/compat-data@7.26.0':
+ resolution: {integrity: sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==}
engines: {node: '>=6.9.0'}
- '@babel/core@7.24.7':
- resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==}
+ '@babel/core@7.26.0':
+ resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
engines: {node: '>=6.9.0'}
- '@babel/generator@7.24.7':
- resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==}
+ '@babel/generator@7.26.0':
+ resolution: {integrity: sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==}
engines: {node: '>=6.9.0'}
- '@babel/helper-annotate-as-pure@7.24.7':
- resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==}
+ '@babel/helper-annotate-as-pure@7.25.9':
+ resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
engines: {node: '>=6.9.0'}
- '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7':
- resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==}
+ '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9':
+ resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==}
engines: {node: '>=6.9.0'}
- '@babel/helper-compilation-targets@7.24.7':
- resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==}
+ '@babel/helper-compilation-targets@7.25.9':
+ resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-create-class-features-plugin@7.24.7':
- resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==}
+ '@babel/helper-create-class-features-plugin@7.25.9':
+ resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-create-regexp-features-plugin@7.24.7':
- resolution: {integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==}
+ '@babel/helper-create-regexp-features-plugin@7.25.9':
+ resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
@@ -247,113 +249,99 @@ packages:
peerDependencies:
'@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- '@babel/helper-environment-visitor@7.24.7':
- resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==}
+ '@babel/helper-member-expression-to-functions@7.25.9':
+ resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-function-name@7.24.7':
- resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==}
+ '@babel/helper-module-imports@7.25.9':
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-hoist-variables@7.24.7':
- resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-member-expression-to-functions@7.24.7':
- resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-imports@7.24.7':
- resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-transforms@7.24.7':
- resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==}
+ '@babel/helper-module-transforms@7.26.0':
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-optimise-call-expression@7.24.7':
- resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==}
+ '@babel/helper-optimise-call-expression@7.25.9':
+ resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-plugin-utils@7.24.7':
- resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==}
+ '@babel/helper-plugin-utils@7.25.9':
+ resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-remap-async-to-generator@7.24.7':
- resolution: {integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==}
+ '@babel/helper-remap-async-to-generator@7.25.9':
+ resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-replace-supers@7.24.7':
- resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==}
+ '@babel/helper-replace-supers@7.25.9':
+ resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-simple-access@7.24.7':
- resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
+ '@babel/helper-simple-access@7.25.9':
+ resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==}
engines: {node: '>=6.9.0'}
- '@babel/helper-skip-transparent-expression-wrappers@7.24.7':
- resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==}
+ '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
+ resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-split-export-declaration@7.24.7':
- resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
+ '@babel/helper-string-parser@7.25.9':
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-string-parser@7.24.7':
- resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==}
+ '@babel/helper-validator-identifier@7.25.9':
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.24.7':
- resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
+ '@babel/helper-validator-option@7.25.9':
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-option@7.24.7':
- resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==}
+ '@babel/helper-wrap-function@7.25.9':
+ resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==}
engines: {node: '>=6.9.0'}
- '@babel/helper-wrap-function@7.24.7':
- resolution: {integrity: sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==}
+ '@babel/helpers@7.26.0':
+ resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
engines: {node: '>=6.9.0'}
- '@babel/helpers@7.24.7':
- resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/highlight@7.24.7':
- resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.24.7':
- resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==}
+ '@babel/parser@7.26.1':
+ resolution: {integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==}
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7':
- resolution: {integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==}
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9':
+ resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7':
- resolution: {integrity: sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==}
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9':
+ resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7':
- resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==}
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9':
+ resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9':
+ resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.13.0
- '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7':
- resolution: {integrity: sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==}
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9':
+ resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
@@ -364,104 +352,31 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-async-generators@7.8.4':
- resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-class-properties@7.12.13':
- resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-class-static-block@7.14.5':
- resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
'@babel/plugin-syntax-dynamic-import@7.8.3':
resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-export-namespace-from@7.8.3':
- resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-import-assertions@7.24.7':
- resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==}
+ '@babel/plugin-syntax-import-assertions@7.26.0':
+ resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-import-attributes@7.24.7':
- resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==}
+ '@babel/plugin-syntax-import-attributes@7.26.0':
+ resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-import-meta@7.10.4':
- resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-json-strings@7.8.3':
- resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-jsx@7.24.7':
- resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==}
+ '@babel/plugin-syntax-jsx@7.25.9':
+ resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
- resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
- resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-numeric-separator@7.10.4':
- resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-object-rest-spread@7.8.3':
- resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-optional-catch-binding@7.8.3':
- resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-optional-chaining@7.8.3':
- resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-private-property-in-object@7.14.5':
- resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-top-level-await@7.14.5':
- resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-typescript@7.24.7':
- resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==}
+ '@babel/plugin-syntax-typescript@7.25.9':
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -472,338 +387,350 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/plugin-transform-arrow-functions@7.24.7':
- resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==}
+ '@babel/plugin-transform-arrow-functions@7.25.9':
+ resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-async-generator-functions@7.24.7':
- resolution: {integrity: sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==}
+ '@babel/plugin-transform-async-generator-functions@7.25.9':
+ resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-async-to-generator@7.24.7':
- resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==}
+ '@babel/plugin-transform-async-to-generator@7.25.9':
+ resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-block-scoped-functions@7.24.7':
- resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==}
+ '@babel/plugin-transform-block-scoped-functions@7.25.9':
+ resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-block-scoping@7.24.7':
- resolution: {integrity: sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==}
+ '@babel/plugin-transform-block-scoping@7.25.9':
+ resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-class-properties@7.24.7':
- resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==}
+ '@babel/plugin-transform-class-properties@7.25.9':
+ resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-class-static-block@7.24.7':
- resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==}
+ '@babel/plugin-transform-class-static-block@7.26.0':
+ resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.12.0
- '@babel/plugin-transform-classes@7.24.7':
- resolution: {integrity: sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==}
+ '@babel/plugin-transform-classes@7.25.9':
+ resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-computed-properties@7.24.7':
- resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==}
+ '@babel/plugin-transform-computed-properties@7.25.9':
+ resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-destructuring@7.24.7':
- resolution: {integrity: sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==}
+ '@babel/plugin-transform-destructuring@7.25.9':
+ resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-dotall-regex@7.24.7':
- resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==}
+ '@babel/plugin-transform-dotall-regex@7.25.9':
+ resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-duplicate-keys@7.24.7':
- resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==}
+ '@babel/plugin-transform-duplicate-keys@7.25.9':
+ resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-dynamic-import@7.24.7':
- resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-exponentiation-operator@7.24.7':
- resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-export-namespace-from@7.24.7':
- resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-for-of@7.24.7':
- resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-function-name@7.24.7':
- resolution: {integrity: sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-json-strings@7.24.7':
- resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-literals@7.24.7':
- resolution: {integrity: sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-logical-assignment-operators@7.24.7':
- resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-member-expression-literals@7.24.7':
- resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-modules-amd@7.24.7':
- resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-modules-commonjs@7.24.7':
- resolution: {integrity: sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-modules-systemjs@7.24.7':
- resolution: {integrity: sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-modules-umd@7.24.7':
- resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-named-capturing-groups-regex@7.24.7':
- resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==}
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9':
+ resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/plugin-transform-new-target@7.24.7':
- resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==}
+ '@babel/plugin-transform-dynamic-import@7.25.9':
+ resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-nullish-coalescing-operator@7.24.7':
- resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==}
+ '@babel/plugin-transform-exponentiation-operator@7.25.9':
+ resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-numeric-separator@7.24.7':
- resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==}
+ '@babel/plugin-transform-export-namespace-from@7.25.9':
+ resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-object-rest-spread@7.24.7':
- resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==}
+ '@babel/plugin-transform-for-of@7.25.9':
+ resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-object-super@7.24.7':
- resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==}
+ '@babel/plugin-transform-function-name@7.25.9':
+ resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-optional-catch-binding@7.24.7':
- resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==}
+ '@babel/plugin-transform-json-strings@7.25.9':
+ resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-optional-chaining@7.24.7':
- resolution: {integrity: sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==}
+ '@babel/plugin-transform-literals@7.25.9':
+ resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-parameters@7.24.7':
- resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==}
+ '@babel/plugin-transform-logical-assignment-operators@7.25.9':
+ resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-private-methods@7.24.7':
- resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==}
+ '@babel/plugin-transform-member-expression-literals@7.25.9':
+ resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-private-property-in-object@7.24.7':
- resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==}
+ '@babel/plugin-transform-modules-amd@7.25.9':
+ resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-property-literals@7.24.7':
- resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==}
+ '@babel/plugin-transform-modules-commonjs@7.25.9':
+ resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-react-constant-elements@7.24.7':
- resolution: {integrity: sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==}
+ '@babel/plugin-transform-modules-systemjs@7.25.9':
+ resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-react-display-name@7.24.7':
- resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==}
+ '@babel/plugin-transform-modules-umd@7.25.9':
+ resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-react-jsx-development@7.24.7':
- resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-react-jsx@7.24.7':
- resolution: {integrity: sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-react-pure-annotations@7.24.7':
- resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-regenerator@7.24.7':
- resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-reserved-words@7.24.7':
- resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-runtime@7.24.7':
- resolution: {integrity: sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-shorthand-properties@7.24.7':
- resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-spread@7.24.7':
- resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-sticky-regex@7.24.7':
- resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-template-literals@7.24.7':
- resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-typeof-symbol@7.24.7':
- resolution: {integrity: sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-typescript@7.24.7':
- resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-unicode-escapes@7.24.7':
- resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-unicode-property-regex@7.24.7':
- resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-unicode-regex@7.24.7':
- resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-unicode-sets-regex@7.24.7':
- resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==}
+ '@babel/plugin-transform-named-capturing-groups-regex@7.25.9':
+ resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/preset-env@7.24.7':
- resolution: {integrity: sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==}
+ '@babel/plugin-transform-new-target@7.25.9':
+ resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.25.9':
+ resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-numeric-separator@7.25.9':
+ resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-object-rest-spread@7.25.9':
+ resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-object-super@7.25.9':
+ resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-catch-binding@7.25.9':
+ resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-chaining@7.25.9':
+ resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-parameters@7.25.9':
+ resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-methods@7.25.9':
+ resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-property-in-object@7.25.9':
+ resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-property-literals@7.25.9':
+ resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-constant-elements@7.25.9':
+ resolution: {integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-display-name@7.25.9':
+ resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-development@7.25.9':
+ resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx@7.25.9':
+ resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-pure-annotations@7.25.9':
+ resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-regenerator@7.25.9':
+ resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-regexp-modifiers@7.26.0':
+ resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-reserved-words@7.25.9':
+ resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-runtime@7.25.9':
+ resolution: {integrity: sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-shorthand-properties@7.25.9':
+ resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-spread@7.25.9':
+ resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-sticky-regex@7.25.9':
+ resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-template-literals@7.25.9':
+ resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typeof-symbol@7.25.9':
+ resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typescript@7.25.9':
+ resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-escapes@7.25.9':
+ resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-property-regex@7.25.9':
+ resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-regex@7.25.9':
+ resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-sets-regex@7.25.9':
+ resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/preset-env@7.26.0':
+ resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -813,39 +740,36 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
- '@babel/preset-react@7.24.7':
- resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==}
+ '@babel/preset-react@7.25.9':
+ resolution: {integrity: sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/preset-typescript@7.24.7':
- resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==}
+ '@babel/preset-typescript@7.26.0':
+ resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/regjsgen@0.8.0':
- resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==}
-
- '@babel/runtime-corejs3@7.24.7':
- resolution: {integrity: sha512-eytSX6JLBY6PVAeQa2bFlDx/7Mmln/gaEpsit5a3WEvjGfiIytEsgAwuIXCPM0xvw0v0cJn3ilq0/TvXrW0kgA==}
+ '@babel/runtime-corejs3@7.26.0':
+ resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==}
engines: {node: '>=6.9.0'}
- '@babel/runtime@7.24.7':
- resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==}
+ '@babel/runtime@7.26.0':
+ resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
engines: {node: '>=6.9.0'}
- '@babel/template@7.24.7':
- resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==}
+ '@babel/template@7.25.9':
+ resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
engines: {node: '>=6.9.0'}
- '@babel/traverse@7.24.7':
- resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==}
+ '@babel/traverse@7.25.9':
+ resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==}
engines: {node: '>=6.9.0'}
- '@babel/types@7.24.7':
- resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
+ '@babel/types@7.26.0':
+ resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
engines: {node: '>=6.9.0'}
'@cfaester/enzyme-adapter-react-18@0.8.0':
@@ -863,11 +787,11 @@ packages:
resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
engines: {node: '>=10.0.0'}
- '@docsearch/css@3.6.0':
- resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==}
+ '@docsearch/css@3.6.2':
+ resolution: {integrity: sha512-vKNZepO2j7MrYBTZIGXvlUOIR+v9KRf70FApRgovWrj3GTs1EITz/Xb0AOlm1xsQBp16clVZj1SY/qaOJbQtZw==}
- '@docsearch/react@3.6.0':
- resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==}
+ '@docsearch/react@3.6.2':
+ resolution: {integrity: sha512-rtZce46OOkVflCQH71IdbXSFK+S8iJZlUF56XBW5rIgx/eG5qoomC7Ag3anZson1bBac/JFQn7XOBfved/IMRA==}
peerDependencies:
'@types/react': '>= 16.8.0 < 19.0.0'
react: '>= 16.8.0 < 19.0.0'
@@ -883,93 +807,95 @@ packages:
search-insights:
optional: true
- '@docusaurus/core@3.4.0':
- resolution: {integrity: sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==}
+ '@docusaurus/core@3.5.2':
+ resolution: {integrity: sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==}
engines: {node: '>=18.0'}
hasBin: true
peerDependencies:
+ '@mdx-js/react': ^3.0.0
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/cssnano-preset@3.4.0':
- resolution: {integrity: sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==}
+ '@docusaurus/cssnano-preset@3.5.2':
+ resolution: {integrity: sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==}
engines: {node: '>=18.0'}
- '@docusaurus/logger@3.4.0':
- resolution: {integrity: sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==}
+ '@docusaurus/logger@3.5.2':
+ resolution: {integrity: sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==}
engines: {node: '>=18.0'}
- '@docusaurus/mdx-loader@3.4.0':
- resolution: {integrity: sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==}
+ '@docusaurus/mdx-loader@3.5.2':
+ resolution: {integrity: sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/module-type-aliases@3.4.0':
- resolution: {integrity: sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==}
+ '@docusaurus/module-type-aliases@3.5.2':
+ resolution: {integrity: sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==}
peerDependencies:
react: '*'
react-dom: '*'
- '@docusaurus/plugin-content-blog@3.4.0':
- resolution: {integrity: sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw==}
+ '@docusaurus/plugin-content-blog@3.5.2':
+ resolution: {integrity: sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ '@docusaurus/plugin-content-docs': '*'
+ react: ^18.0.0
+ react-dom: ^18.0.0
+
+ '@docusaurus/plugin-content-docs@3.5.2':
+ resolution: {integrity: sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/plugin-content-docs@3.4.0':
- resolution: {integrity: sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==}
+ '@docusaurus/plugin-content-pages@3.5.2':
+ resolution: {integrity: sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/plugin-content-pages@3.4.0':
- resolution: {integrity: sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg==}
+ '@docusaurus/plugin-debug@3.5.2':
+ resolution: {integrity: sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/plugin-debug@3.4.0':
- resolution: {integrity: sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg==}
+ '@docusaurus/plugin-google-analytics@3.5.2':
+ resolution: {integrity: sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/plugin-google-analytics@3.4.0':
- resolution: {integrity: sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA==}
+ '@docusaurus/plugin-google-gtag@3.5.2':
+ resolution: {integrity: sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/plugin-google-gtag@3.4.0':
- resolution: {integrity: sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA==}
+ '@docusaurus/plugin-google-tag-manager@3.5.2':
+ resolution: {integrity: sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/plugin-google-tag-manager@3.4.0':
- resolution: {integrity: sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ==}
+ '@docusaurus/plugin-sitemap@3.5.2':
+ resolution: {integrity: sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/plugin-sitemap@3.4.0':
- resolution: {integrity: sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q==}
- engines: {node: '>=18.0'}
- peerDependencies:
- react: ^18.0.0
- react-dom: ^18.0.0
-
- '@docusaurus/preset-classic@3.4.0':
- resolution: {integrity: sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg==}
+ '@docusaurus/preset-classic@3.5.2':
+ resolution: {integrity: sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
@@ -980,42 +906,43 @@ packages:
peerDependencies:
react: '*'
- '@docusaurus/theme-classic@3.4.0':
- resolution: {integrity: sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q==}
+ '@docusaurus/theme-classic@3.5.2':
+ resolution: {integrity: sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/theme-common@3.4.0':
- resolution: {integrity: sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA==}
+ '@docusaurus/theme-common@3.5.2':
+ resolution: {integrity: sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ '@docusaurus/plugin-content-docs': '*'
+ react: ^18.0.0
+ react-dom: ^18.0.0
+
+ '@docusaurus/theme-search-algolia@3.5.2':
+ resolution: {integrity: sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==}
engines: {node: '>=18.0'}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/theme-search-algolia@3.4.0':
- resolution: {integrity: sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q==}
+ '@docusaurus/theme-translations@3.5.2':
+ resolution: {integrity: sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==}
engines: {node: '>=18.0'}
+
+ '@docusaurus/tsconfig@3.5.2':
+ resolution: {integrity: sha512-rQ7toURCFnWAIn8ubcquDs0ewhPwviMzxh6WpRjBW7sJVCXb6yzwUaY3HMNa0VXCFw+qkIbFywrMTf+Pb4uHWQ==}
+
+ '@docusaurus/types@3.5.2':
+ resolution: {integrity: sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==}
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- '@docusaurus/theme-translations@3.4.0':
- resolution: {integrity: sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==}
- engines: {node: '>=18.0'}
-
- '@docusaurus/tsconfig@3.4.0':
- resolution: {integrity: sha512-0qENiJ+TRaeTzcg4olrnh0BQ7eCxTgbYWBnWUeQDc84UYkt/T3pDNnm3SiQkqPb+YQ1qtYFlC0RriAElclo8Dg==}
-
- '@docusaurus/types@3.4.0':
- resolution: {integrity: sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==}
- peerDependencies:
- react: ^18.0.0
- react-dom: ^18.0.0
-
- '@docusaurus/utils-common@3.4.0':
- resolution: {integrity: sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==}
+ '@docusaurus/utils-common@3.5.2':
+ resolution: {integrity: sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==}
engines: {node: '>=18.0'}
peerDependencies:
'@docusaurus/types': '*'
@@ -1023,12 +950,12 @@ packages:
'@docusaurus/types':
optional: true
- '@docusaurus/utils-validation@3.4.0':
- resolution: {integrity: sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==}
+ '@docusaurus/utils-validation@3.5.2':
+ resolution: {integrity: sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==}
engines: {node: '>=18.0'}
- '@docusaurus/utils@3.4.0':
- resolution: {integrity: sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==}
+ '@docusaurus/utils@3.5.2':
+ resolution: {integrity: sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==}
engines: {node: '>=18.0'}
peerDependencies:
'@docusaurus/types': '*'
@@ -1039,19 +966,19 @@ packages:
'@easyops-cn/autocomplete.js@0.38.1':
resolution: {integrity: sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==}
- '@easyops-cn/docusaurus-search-local@0.44.2':
- resolution: {integrity: sha512-4tMBU54R1O6ITxkMGwOEifSHNkZLa2fb4ajGc8rd6TYZ0a8+jlu/u/5gYtw1s6sGGMRkwyG+QI6HD0bEnCRa1w==}
+ '@easyops-cn/docusaurus-search-local@0.45.0':
+ resolution: {integrity: sha512-ccJjeYmBHrv2v8Y9eQnH79S0PEKcogACKkEatEKPcad7usQj/14jA9POUUUYW/yougLSXghwe+uIncbuUBuBFg==}
engines: {node: '>=12'}
peerDependencies:
'@docusaurus/theme-common': ^2 || ^3
react: ^16.14.0 || ^17 || ^18
react-dom: ^16.14.0 || 17 || ^18
- '@emnapi/core@1.2.0':
- resolution: {integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==}
+ '@emnapi/core@1.3.1':
+ resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==}
- '@emnapi/runtime@1.2.0':
- resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==}
+ '@emnapi/runtime@1.3.1':
+ resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
'@emnapi/wasi-threads@1.0.1':
resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
@@ -1235,8 +1162,8 @@ packages:
'@jridgewell/source-map@0.3.6':
resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
- '@jridgewell/sourcemap-codec@1.4.15':
- resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
@@ -1247,100 +1174,103 @@ packages:
'@mdx-js/mdx@3.0.1':
resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==}
- '@mdx-js/react@3.0.1':
- resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==}
+ '@mdx-js/mdx@3.1.0':
+ resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==}
+
+ '@mdx-js/react@3.1.0':
+ resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==}
peerDependencies:
'@types/react': '>=16'
react: '>=16'
- '@napi-rs/wasm-runtime@0.2.4':
- resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==}
+ '@napi-rs/wasm-runtime@0.2.5':
+ resolution: {integrity: sha512-kwUxR7J9WLutBbulqg1dfOrMTwhMdXLdcGUhcbCcGwnPLt3gz19uHVdwH1syKVDbE022ZS2vZxOWflFLS0YTjw==}
- '@node-rs/jieba-android-arm-eabi@1.10.3':
- resolution: {integrity: sha512-fuqVtaYlUKZg3cqagYFxj1DSa7ZHKXLle4iGH2kbQWg7Kw6cf7aCYBHIUZuH5sliK10M/CWccZ+SGRUwcSGfbg==}
+ '@node-rs/jieba-android-arm-eabi@1.10.4':
+ resolution: {integrity: sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==}
engines: {node: '>= 10'}
cpu: [arm]
os: [android]
- '@node-rs/jieba-android-arm64@1.10.3':
- resolution: {integrity: sha512-iuZZZq5yD9lT+AgaXpFe19gtAsIecUODRLLaBFbavjgjLk5cumv38ytWjS36s/eqptwI15MQfysSYOlWtMEG5g==}
+ '@node-rs/jieba-android-arm64@1.10.4':
+ resolution: {integrity: sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
- '@node-rs/jieba-darwin-arm64@1.10.3':
- resolution: {integrity: sha512-dwPhkav1tEARskwPz91UUXL2NXy4h0lJYTuJzpGgwXxm552zBM2JJ41kjah1364j+EOq5At3NQvf5r5rH89phQ==}
+ '@node-rs/jieba-darwin-arm64@1.10.4':
+ resolution: {integrity: sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@node-rs/jieba-darwin-x64@1.10.3':
- resolution: {integrity: sha512-kjxvV6G1baQo/2I3mELv5qGv4Q0rhd5srwXhypSxMWZFtSpNwCDsLcIOR5bvMBci6QVFfZOs6WD6DKiWVz0SlA==}
+ '@node-rs/jieba-darwin-x64@1.10.4':
+ resolution: {integrity: sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@node-rs/jieba-freebsd-x64@1.10.3':
- resolution: {integrity: sha512-QYTsn+zlWRil+MuBeLfTK5Md4GluOf2lHnFqjrOZW2oMgNOvxB3qoLV4TUf70S/E2XHeP6PUdjCKItX8C7GQPg==}
+ '@node-rs/jieba-freebsd-x64@1.10.4':
+ resolution: {integrity: sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
- '@node-rs/jieba-linux-arm-gnueabihf@1.10.3':
- resolution: {integrity: sha512-UFB43kDOvqmbRl99e3GPwaTuwJZaAvgLaMTvBkmxww4MpQH6G1k31RLzMW/S21uSQso2lj6W/Mm59gaJk2FiyA==}
+ '@node-rs/jieba-linux-arm-gnueabihf@1.10.4':
+ resolution: {integrity: sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
- '@node-rs/jieba-linux-arm64-gnu@1.10.3':
- resolution: {integrity: sha512-bu++yWi10wZtnS5uLcwxzxKmHVT77NgQMK8JiQr1TWCl3Y1Th7CnEHQtxfVB489edDK8l644h1/4zSTe5fRnOQ==}
+ '@node-rs/jieba-linux-arm64-gnu@1.10.4':
+ resolution: {integrity: sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@node-rs/jieba-linux-arm64-musl@1.10.3':
- resolution: {integrity: sha512-pJh+SzrK1HaKakhdFM+ew9vXwpZqMxy9u0U7J4GT+3GvOwnAZ+KjeaHebIfgOz7ZHvp/T4YBNf8oWW4zwj3AJw==}
+ '@node-rs/jieba-linux-arm64-musl@1.10.4':
+ resolution: {integrity: sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@node-rs/jieba-linux-x64-gnu@1.10.3':
- resolution: {integrity: sha512-GF5cfvu/0wXO2fVX/XV3WYH/xEGWzMBvfqLhGiA1OA1xHIufnA1T7uU3ZXkyoNi5Bzf6dmxnwtE4CJL0nvhwjQ==}
+ '@node-rs/jieba-linux-x64-gnu@1.10.4':
+ resolution: {integrity: sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@node-rs/jieba-linux-x64-musl@1.10.3':
- resolution: {integrity: sha512-h45HMVU/hgzQ0saXNsK9fKlGdah1i1cXZULpB5vQRlRL2ZIaGp+ULtWTogS7vkoo2K8s2l4tqakWMg9eUjIJ2A==}
+ '@node-rs/jieba-linux-x64-musl@1.10.4':
+ resolution: {integrity: sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@node-rs/jieba-wasm32-wasi@1.10.3':
- resolution: {integrity: sha512-vuoQ62vVoedNGcBmIi4UWdtNBOZG8B+vDYfjx3FD6rNg6g/RgwbVjYXbOVMOQwX06Ob9CfrutICXdUGHgoxzEQ==}
+ '@node-rs/jieba-wasm32-wasi@1.10.4':
+ resolution: {integrity: sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
- '@node-rs/jieba-win32-arm64-msvc@1.10.3':
- resolution: {integrity: sha512-B8t4dh56TZnMLBoYWDkopf1ed37Ru/iU1qiIeBkbZWXGmNBChNZUOd//eaPOFjx8m9Sfc8bkj3FBRWt/kTAhmw==}
+ '@node-rs/jieba-win32-arm64-msvc@1.10.4':
+ resolution: {integrity: sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@node-rs/jieba-win32-ia32-msvc@1.10.3':
- resolution: {integrity: sha512-SKuPGZJ5T+X4jOn1S8LklOSZ6HC7UBiw0hwi2z9uqX6WgElquLjGi/xfZ2gPqffeR/5K/PUu7aqYUUPL1XonVQ==}
+ '@node-rs/jieba-win32-ia32-msvc@1.10.4':
+ resolution: {integrity: sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
- '@node-rs/jieba-win32-x64-msvc@1.10.3':
- resolution: {integrity: sha512-j9I4+a/tf2hsLu8Sr0NhcLBVNBBQctO2mzcjemMpRa1SlEeODyic9RIyP8Ljz3YTN6MYqKh1KA9iR1xvxjxYFg==}
+ '@node-rs/jieba-win32-x64-msvc@1.10.4':
+ resolution: {integrity: sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@node-rs/jieba@1.10.3':
- resolution: {integrity: sha512-SG0CWHmhIveH6upJURgymDKLertEPYbOc5NSFIpbZWW1W2MpqgumVteQO+5YBlkmpR6jMNDPWNQyQwkB6HoeNg==}
+ '@node-rs/jieba@1.10.4':
+ resolution: {integrity: sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==}
engines: {node: '>= 10'}
'@nodelib/fs.scandir@2.1.5':
@@ -1363,18 +1293,18 @@ packages:
resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
engines: {node: '>=12.22.0'}
- '@pnpm/npm-conf@2.2.2':
- resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==}
+ '@pnpm/npm-conf@2.3.1':
+ resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==}
engines: {node: '>=12'}
- '@polka/url@1.0.0-next.25':
- resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
+ '@polka/url@1.0.0-next.28':
+ resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
- '@redocly/ajv@8.11.0':
- resolution: {integrity: sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==}
+ '@redocly/ajv@8.11.2':
+ resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==}
- '@redocly/config@0.6.2':
- resolution: {integrity: sha512-c3K5u64eMnr2ootPcpEI0ioIRLE8QP8ptvLxG9MwAmb2sU8HMRfVwXDU3AZiMVY2w4Ts0mDc+Xv4HTIk8DRqFw==}
+ '@redocly/config@0.6.3':
+ resolution: {integrity: sha512-hGWJgCsXRw0Ow4rplqRlUQifZvoSwZipkYnt11e3SeH1Eb23VUIDBcRuaQOUqy1wn0eevXkU2GzzQ8fbKdQ7Mg==}
'@redocly/openapi-core@1.16.0':
resolution: {integrity: sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg==}
@@ -1399,9 +1329,9 @@ packages:
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
engines: {node: '>=10'}
- '@sindresorhus/is@6.3.1':
- resolution: {integrity: sha512-FX4MfcifwJyFOI2lPoX7PQxCqx8BG1HCho7WdiXwpEQx1Ycij0JxkfYtGK7yqNScrZGSlt6RE6sw8QYoH7eKnQ==}
- engines: {node: '>=16'}
+ '@sindresorhus/is@7.0.1':
+ resolution: {integrity: sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==}
+ engines: {node: '>=18'}
'@slorber/remark-comment@1.0.0':
resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==}
@@ -1519,20 +1449,17 @@ packages:
'@types/dompurify@3.0.5':
resolution: {integrity: sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==}
- '@types/eslint-scope@3.7.7':
- resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
-
- '@types/eslint@8.56.10':
- resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==}
-
'@types/estree-jsx@1.0.5':
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
- '@types/estree@1.0.5':
- resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
- '@types/express-serve-static-core@4.19.5':
- resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==}
+ '@types/express-serve-static-core@4.19.6':
+ resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
+
+ '@types/express-serve-static-core@5.0.1':
+ resolution: {integrity: sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==}
'@types/express@4.17.21':
resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
@@ -1555,8 +1482,8 @@ packages:
'@types/http-errors@2.0.4':
resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
- '@types/http-proxy@1.17.14':
- resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==}
+ '@types/http-proxy@1.17.15':
+ resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==}
'@types/istanbul-lib-coverage@2.0.6':
resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
@@ -1588,20 +1515,20 @@ packages:
'@types/node@17.0.45':
resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
- '@types/node@20.14.10':
- resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==}
+ '@types/node@20.17.2':
+ resolution: {integrity: sha512-OOHK4sjXqkL7yQ7VEEHcf6+0jSvKjWqwnaCtY7AKD/VLEvRHMsxxu7eI8ErnjxHS8VwmekD4PeVCpu4qZEZSxg==}
'@types/parse-json@4.0.2':
resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
- '@types/prismjs@1.26.4':
- resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==}
+ '@types/prismjs@1.26.5':
+ resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==}
- '@types/prop-types@15.7.12':
- resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
+ '@types/prop-types@15.7.13':
+ resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
- '@types/qs@6.9.15':
- resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==}
+ '@types/qs@6.9.16':
+ resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==}
'@types/range-parser@1.2.7':
resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
@@ -1618,8 +1545,8 @@ packages:
'@types/react-router@5.1.20':
resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==}
- '@types/react@18.3.3':
- resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==}
+ '@types/react@18.3.12':
+ resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==}
'@types/retry@0.12.0':
resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
@@ -1645,20 +1572,20 @@ packages:
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
- '@types/unist@2.0.10':
- resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
- '@types/unist@3.0.2':
- resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==}
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
- '@types/ws@8.5.10':
- resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
+ '@types/ws@8.5.12':
+ resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==}
'@types/yargs-parser@21.0.3':
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
- '@types/yargs@17.0.32':
- resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==}
+ '@types/yargs@17.0.33':
+ resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
'@ungap/structured-clone@1.2.0':
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
@@ -1728,8 +1655,8 @@ packages:
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- acorn-walk@8.3.3:
- resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==}
+ acorn-walk@8.3.4:
+ resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
engines: {node: '>=0.4.0'}
acorn@8.12.1:
@@ -1737,6 +1664,11 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ acorn@8.13.0:
+ resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
address@1.2.2:
resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==}
engines: {node: '>= 10.0.0'}
@@ -1770,11 +1702,11 @@ packages:
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
- ajv@8.16.0:
- resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==}
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
- algoliasearch-helper@3.22.2:
- resolution: {integrity: sha512-3YQ6eo7uYOCHeQ2ZpD+OoT3aJJwMNKEnwtu8WMzm81XmBOSCwRjQditH9CeSOQ38qhHkuGw23pbq+kULkIJLcw==}
+ algoliasearch-helper@3.22.5:
+ resolution: {integrity: sha512-lWvhdnc+aKOKx8jyA3bsdEgHzm/sglC4cYdMG4xSQyRiPLJVJtH/IVYZG3Hp6PkTEhQqhyVYkeP9z2IlcHJsWw==}
peerDependencies:
algoliasearch: '>= 3.1 < 6'
@@ -1793,14 +1725,10 @@ packages:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
- ansi-regex@6.0.1:
- resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
engines: {node: '>=12'}
- ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
-
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
@@ -1845,8 +1773,8 @@ packages:
resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
engines: {node: '>= 0.4'}
- astring@1.8.6:
- resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==}
+ astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
hasBin: true
asynckit@0.4.0:
@@ -1856,8 +1784,8 @@ packages:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
engines: {node: '>= 4.0.0'}
- autoprefixer@10.4.19:
- resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==}
+ autoprefixer@10.4.20:
+ resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies:
@@ -1867,11 +1795,11 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- axios@1.7.2:
- resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==}
+ axios@1.7.7:
+ resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==}
- babel-loader@9.1.3:
- resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==}
+ babel-loader@9.2.1:
+ resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==}
engines: {node: '>= 14.15.0'}
peerDependencies:
'@babel/core': ^7.12.0
@@ -1885,8 +1813,8 @@ packages:
peerDependencies:
'@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
- babel-plugin-polyfill-corejs3@0.10.4:
- resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==}
+ babel-plugin-polyfill-corejs3@0.10.6:
+ resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==}
peerDependencies:
'@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
@@ -1911,8 +1839,8 @@ packages:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
- body-parser@1.20.2:
- resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
+ body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
bonjour-service@1.2.1:
@@ -1939,8 +1867,8 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browserslist@4.23.1:
- resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==}
+ browserslist@4.24.2:
+ resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
@@ -1991,16 +1919,12 @@ packages:
caniuse-api@3.0.0:
resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
- caniuse-lite@1.0.30001640:
- resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==}
+ caniuse-lite@1.0.30001671:
+ resolution: {integrity: sha512-jocyVaSSfXg2faluE6hrWkMgDOiULBMca4QLtDT39hw1YxaIPHWc1CcTCKkPmHgGH6tKji6ZNbMSmUAvENf2/A==}
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
- chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
-
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@@ -2028,6 +1952,10 @@ packages:
cheerio-select@2.1.0:
resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
+ cheerio@1.0.0:
+ resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==}
+ engines: {node: '>=18.17'}
+
cheerio@1.0.0-rc.12:
resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
engines: {node: '>= 6'}
@@ -2082,16 +2010,10 @@ packages:
collapse-white-space@2.1.0:
resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
- color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
-
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
- color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
@@ -2148,9 +2070,9 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- concurrently@8.2.2:
- resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==}
- engines: {node: ^14.13.0 || >=16.0.0}
+ concurrently@9.0.1:
+ resolution: {integrity: sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==}
+ engines: {node: '>=18'}
hasBin: true
config-chain@1.1.13:
@@ -2185,9 +2107,9 @@ packages:
cookie-signature@1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
- cookie@0.6.0:
- resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
- engines: {node: '>= 0.6'}
+ cookie@1.0.1:
+ resolution: {integrity: sha512-Xd8lFX4LM9QEEwxQpF9J9NTUh8pmdJO0cyRJhFiDoLTk2eH8FXlRv2IFGYVadZpqI3j8fhNrSdKCeYPxiAhLXw==}
+ engines: {node: '>=18'}
copy-text-to-clipboard@3.2.0:
resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==}
@@ -2199,14 +2121,14 @@ packages:
peerDependencies:
webpack: ^5.1.0
- core-js-compat@3.37.1:
- resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==}
+ core-js-compat@3.38.1:
+ resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==}
- core-js-pure@3.37.1:
- resolution: {integrity: sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==}
+ core-js-pure@3.38.1:
+ resolution: {integrity: sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==}
- core-js@3.37.1:
- resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==}
+ core-js@3.38.1:
+ resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==}
core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
@@ -2333,8 +2255,8 @@ packages:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
- cssstyle@4.0.1:
- resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
+ cssstyle@4.1.0:
+ resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==}
engines: {node: '>=18'}
csstype@3.1.3:
@@ -2356,10 +2278,6 @@ packages:
resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
engines: {node: '>= 0.4'}
- date-fns@2.30.0:
- resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
- engines: {node: '>=0.11'}
-
debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
@@ -2371,8 +2289,8 @@ packages:
supports-color:
optional: true
- debug@4.3.5:
- resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
@@ -2478,8 +2396,8 @@ packages:
peerDependencies:
'@docusaurus/utils': ^3.0.0
- docusaurus-theme-redoc@2.1.1:
- resolution: {integrity: sha512-a9yuYyGVhj7NgBYiqJyjLEkJg/yTdsqg9Rn/cG8YXMIFwxIpn4tanIplUqwisK2PS81ZxOv7SfSgvGm/FSi/wA==}
+ docusaurus-theme-redoc@2.1.2:
+ resolution: {integrity: sha512-UB6g+YDPjVgFMhJnIUaW/mNl9vsCMbrMQutgdoG5DaI+HpxO2sV+zT2z23Wg6ngi2GM+oxEhYf5Qc1dPwKZqBQ==}
engines: {node: '>=18'}
peerDependencies:
'@docusaurus/theme-common': ^3.0.0
@@ -2505,8 +2423,8 @@ packages:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
- dompurify@3.1.6:
- resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==}
+ dompurify@3.1.7:
+ resolution: {integrity: sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==}
domutils@2.8.0:
resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
@@ -2530,8 +2448,8 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
- electron-to-chromium@1.4.817:
- resolution: {integrity: sha512-3znu+lZMIbTe8ZOs360OMJvVroVF2NpNI8T5jfLnDetVvj0uNmIucZzQVYMSJfsu9f47Ssox1Gt46PR+R+1JUg==}
+ electron-to-chromium@1.5.47:
+ resolution: {integrity: sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -2546,15 +2464,22 @@ packages:
resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
engines: {node: '>= 4'}
- emoticon@4.0.1:
- resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==}
+ emoticon@4.1.0:
+ resolution: {integrity: sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==}
encodeurl@1.0.2:
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
engines: {node: '>= 0.8'}
- enhanced-resolve@5.17.0:
- resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==}
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ encoding-sniffer@0.2.0:
+ resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==}
+
+ enhanced-resolve@5.17.1:
+ resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==}
engines: {node: '>=10.13.0'}
entities@2.2.0:
@@ -2609,8 +2534,14 @@ packages:
es6-promise@3.3.1:
resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
- esbuild-loader@4.2.0:
- resolution: {integrity: sha512-BhwHchuDknxIa69AqOPeZh2fIFqj2AzZKC1E3RBRvXSuyk5drsqMrwsgYZJufX41yrauLYjDM3KBmruoGl1NWQ==}
+ esast-util-from-estree@2.0.0:
+ resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
+
+ esast-util-from-js@2.0.1:
+ resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
+
+ esbuild-loader@4.2.2:
+ resolution: {integrity: sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==}
peerDependencies:
webpack: ^4.40.0 || ^5.0.0
@@ -2619,8 +2550,8 @@ packages:
engines: {node: '>=12'}
hasBin: true
- escalade@3.1.2:
- resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
escape-goat@4.0.0:
@@ -2630,10 +2561,6 @@ packages:
escape-html@1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
- escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
-
escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
@@ -2672,6 +2599,9 @@ packages:
estree-util-is-identifier-name@3.0.0:
resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+ estree-util-scope@1.0.0:
+ resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==}
+
estree-util-to-js@2.0.0:
resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==}
@@ -2714,8 +2644,8 @@ packages:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
- express@4.19.2:
- resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==}
+ express@4.21.1:
+ resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==}
engines: {node: '>= 0.10.0'}
extend-shallow@2.0.1:
@@ -2738,8 +2668,8 @@ packages:
fast-safe-stringify@2.1.1:
resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
- fast-url-parser@1.1.3:
- resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
+ fast-uri@3.0.3:
+ resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==}
fastq@1.17.1:
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
@@ -2769,8 +2699,8 @@ packages:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
- finalhandler@1.2.0:
- resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
+ finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
engines: {node: '>= 0.8'}
find-cache-dir@4.0.0:
@@ -2793,8 +2723,8 @@ packages:
resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
hasBin: true
- follow-redirects@1.15.6:
- resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
@@ -2901,10 +2831,6 @@ packages:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
- get-stream@8.0.1:
- resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
- engines: {node: '>=16'}
-
get-stream@9.0.1:
resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
engines: {node: '>=18'}
@@ -2913,8 +2839,8 @@ packages:
resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
engines: {node: '>= 0.4'}
- get-tsconfig@4.7.5:
- resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==}
+ get-tsconfig@4.8.1:
+ resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
github-slugger@1.5.0:
resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
@@ -2965,8 +2891,8 @@ packages:
gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
- got@14.4.1:
- resolution: {integrity: sha512-IvDJbJBUeexX74xNQuMIVgCRRuNOm5wuK+OC3Dc2pnSoh1AOmgc7JVj7WC+cJ4u0aPcO9KZ2frTXcqK4W/5qTQ==}
+ got@14.4.3:
+ resolution: {integrity: sha512-iTC0Z87yxSijWTh/IpvGpwOhIQK7+GgWkYrMRoN/hB9qeRj9RPuLGODwevs0p5idUf7nrxCVa5IlOmK3b8z+KA==}
engines: {node: '>=20'}
graceful-fs@4.2.10:
@@ -2989,10 +2915,6 @@ packages:
has-bigints@1.0.2:
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
- has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
-
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
@@ -3039,6 +2961,9 @@ packages:
hast-util-to-jsx-runtime@2.3.0:
resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==}
+ hast-util-to-jsx-runtime@2.3.2:
+ resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==}
+
hast-util-to-parse5@8.0.0:
resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
@@ -3091,8 +3016,8 @@ packages:
html-void-elements@3.0.0:
resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
- html-webpack-plugin@5.6.0:
- resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==}
+ html-webpack-plugin@5.6.3:
+ resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==}
engines: {node: '>=10.13.0'}
peerDependencies:
'@rspack/core': 0.x || 1.x
@@ -3109,6 +3034,9 @@ packages:
htmlparser2@8.0.2:
resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+ htmlparser2@9.1.0:
+ resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
+
http-cache-semantics@4.1.1:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
@@ -3130,8 +3058,8 @@ packages:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
- http-proxy-middleware@2.0.6:
- resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==}
+ http-proxy-middleware@2.0.7:
+ resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/express': ^4.17.13
@@ -3172,8 +3100,8 @@ packages:
peerDependencies:
postcss: ^8.1.0
- ignore@5.3.1:
- resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
image-size@1.1.1:
@@ -3203,8 +3131,8 @@ packages:
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
engines: {node: '>=8'}
- infima@0.2.0-alpha.43:
- resolution: {integrity: sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==}
+ infima@0.2.0-alpha.44:
+ resolution: {integrity: sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==}
engines: {node: '>=12'}
inflight@1.0.6:
@@ -3227,8 +3155,8 @@ packages:
inline-style-parser@0.1.1:
resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
- inline-style-parser@0.2.3:
- resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==}
+ inline-style-parser@0.2.4:
+ resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
internal-slot@1.0.7:
resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
@@ -3281,8 +3209,8 @@ packages:
resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
hasBin: true
- is-core-module@2.14.0:
- resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==}
+ is-core-module@2.15.1:
+ resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
engines: {node: '>= 0.4'}
is-data-view@1.0.1:
@@ -3427,9 +3355,6 @@ packages:
resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==}
engines: {node: '>=12'}
- isarray@0.0.1:
- resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
-
isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
@@ -3443,8 +3368,8 @@ packages:
resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
engines: {node: '>=0.10.0'}
- isomorphic-dompurify@2.12.0:
- resolution: {integrity: sha512-jJm6VgJ9toBLqNUHuLudn+2Q3NBBaoPbsh5SzzO2dp9Zq9+p6fEg4Ffuq9RZsofb8OnqE6FJVVq3MRDLlmBHpA==}
+ isomorphic-dompurify@2.16.0:
+ resolution: {integrity: sha512-cXhX2owp8rPxafCr0ywqy2CGI/4ceLNgWkWBEvUz64KTbtg3oRL2ZRqq/zW0pzt4YtDjkHLbwcp/lozpKzAQjg==}
engines: {node: '>=18'}
jest-util@29.7.0:
@@ -3481,8 +3406,8 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
- jsdom@24.1.0:
- resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==}
+ jsdom@25.0.1:
+ resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==}
engines: {node: '>=18'}
peerDependencies:
canvas: ^2.11.2
@@ -3490,13 +3415,9 @@ packages:
canvas:
optional: true
- jsesc@0.5.0:
- resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
- hasBin: true
-
- jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
+ jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
hasBin: true
json-buffer@3.0.1:
@@ -3540,8 +3461,8 @@ packages:
resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==}
engines: {node: '>=14.16'}
- launch-editor@2.8.0:
- resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==}
+ launch-editor@2.9.1:
+ resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==}
leven@3.1.0:
resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
@@ -3629,11 +3550,11 @@ packages:
resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
engines: {node: '>=16'}
- markdown-table@3.0.3:
- resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
- marked@13.0.2:
- resolution: {integrity: sha512-J6CPjP8pS5sgrRqxVRvkCIkZ6MFdRIjDkwUwgJ9nL2fbmM6qGQeB2C16hi8Cc9BOzj6xXzy0jyi0iPIfnMHYzA==}
+ marked@14.1.3:
+ resolution: {integrity: sha512-ZibJqTULGlt9g5k4VMARAktMAjXoVnnr+Y3aCqW1oDftcV4BA3UmrBifzXoZyenHRk75csiPu9iwsTj4VNBT0g==}
engines: {node: '>= 18'}
hasBin: true
@@ -3651,11 +3572,14 @@ packages:
mdast-util-from-markdown@2.0.1:
resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==}
+ mdast-util-from-markdown@2.0.2:
+ resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
+
mdast-util-frontmatter@2.0.1:
resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==}
- mdast-util-gfm-autolink-literal@2.0.0:
- resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==}
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
mdast-util-gfm-footnote@2.0.0:
resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
@@ -3672,11 +3596,11 @@ packages:
mdast-util-gfm@3.0.0:
resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
- mdast-util-mdx-expression@2.0.0:
- resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==}
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
- mdast-util-mdx-jsx@3.1.2:
- resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==}
+ mdast-util-mdx-jsx@3.1.3:
+ resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==}
mdast-util-mdx@3.0.0:
resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
@@ -3710,8 +3634,8 @@ packages:
resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
engines: {node: '>= 4.0.0'}
- merge-descriptors@1.0.1:
- resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -3727,8 +3651,8 @@ packages:
micromark-core-commonmark@2.0.1:
resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==}
- micromark-extension-directive@3.0.0:
- resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==}
+ micromark-extension-directive@3.0.2:
+ resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==}
micromark-extension-frontmatter@2.0.0:
resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==}
@@ -3757,8 +3681,8 @@ packages:
micromark-extension-mdx-expression@3.0.0:
resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==}
- micromark-extension-mdx-jsx@3.0.0:
- resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==}
+ micromark-extension-mdx-jsx@3.0.1:
+ resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==}
micromark-extension-mdx-md@2.0.0:
resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
@@ -3775,8 +3699,8 @@ packages:
micromark-factory-label@2.0.0:
resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
- micromark-factory-mdx-expression@2.0.1:
- resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==}
+ micromark-factory-mdx-expression@2.0.2:
+ resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==}
micromark-factory-space@1.1.0:
resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==}
@@ -3847,8 +3771,8 @@ packages:
micromark@4.0.0:
resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
- micromatch@4.0.7:
- resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
mime-db@1.33.0:
@@ -3859,6 +3783,10 @@ packages:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
+ mime-db@1.53.0:
+ resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==}
+ engines: {node: '>= 0.6'}
+
mime-types@2.1.18:
resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
engines: {node: '>= 0.6'}
@@ -3884,8 +3812,8 @@ packages:
resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- mini-css-extract-plugin@2.9.0:
- resolution: {integrity: sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==}
+ mini-css-extract-plugin@2.9.1:
+ resolution: {integrity: sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==}
engines: {node: '>= 12.13.0'}
peerDependencies:
webpack: ^5.0.0
@@ -3929,8 +3857,8 @@ packages:
react-native:
optional: true
- mobx@6.13.0:
- resolution: {integrity: sha512-1laWODrBWmB7mDJ8EClCjUQTyLwJ0ydJgE4FtK7t9r3JnjXgc9OhmYs2P4RtHrY1co5+4T6cKP2UswX2SU29mA==}
+ mobx@6.13.5:
+ resolution: {integrity: sha512-/HTWzW2s8J1Gqt+WmUj5Y0mddZk+LInejADc79NJadrWla3rHzmRHki/mnEUH1AvOmbNTZ1BRbKxr8DSgfdjMA==}
moo@0.5.2:
resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==}
@@ -3942,9 +3870,6 @@ packages:
ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
- ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -3995,8 +3920,8 @@ packages:
node-readfiles@0.2.0:
resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==}
- node-releases@2.0.14:
- resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+ node-releases@2.0.18:
+ resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
@@ -4020,8 +3945,8 @@ packages:
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
- nwsapi@2.2.10:
- resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==}
+ nwsapi@2.2.13:
+ resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==}
oas-kit-common@1.0.8:
resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==}
@@ -4157,12 +4082,18 @@ packages:
parse-numeric-range@1.3.0:
resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==}
- parse5-htmlparser2-tree-adapter@7.0.0:
- resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==}
+ parse5-htmlparser2-tree-adapter@7.1.0:
+ resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==}
+
+ parse5-parser-stream@7.1.2:
+ resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==}
parse5@7.1.2:
resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+ parse5@7.2.0:
+ resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==}
+
parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
@@ -4199,14 +4130,8 @@ packages:
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- path-to-regexp@0.1.7:
- resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
-
- path-to-regexp@1.8.0:
- resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==}
-
- path-to-regexp@2.2.1:
- resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==}
+ path-to-regexp@3.3.0:
+ resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==}
path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
@@ -4221,8 +4146,11 @@ packages:
periscopic@3.1.0:
resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
- picocolors@1.0.1:
- resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ picocolors@1.1.0:
+ resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -4429,6 +4357,11 @@ packages:
peerDependencies:
postcss: ^8.4.31
+ postcss-prefix-selector@1.16.1:
+ resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==}
+ peerDependencies:
+ postcss: '>4 <9'
+
postcss-reduce-idents@6.0.3:
resolution: {integrity: sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==}
engines: {node: ^14 || ^16 || >=18.0}
@@ -4447,8 +4380,8 @@ packages:
peerDependencies:
postcss: ^8.4.31
- postcss-selector-parser@6.1.0:
- resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==}
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'}
postcss-sort-media-queries@5.2.0:
@@ -4482,8 +4415,8 @@ packages:
resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.4.39:
- resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==}
+ postcss@8.4.47:
+ resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14}
pretty-error@4.0.0:
@@ -4493,8 +4426,8 @@ packages:
resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==}
engines: {node: '>=4'}
- prism-react-renderer@2.3.1:
- resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==}
+ prism-react-renderer@2.4.0:
+ resolution: {integrity: sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==}
peerDependencies:
react: '>=16.0.0'
@@ -4525,12 +4458,6 @@ packages:
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
- psl@1.9.0:
- resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
-
- punycode@1.4.1:
- resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
-
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
@@ -4539,13 +4466,10 @@ packages:
resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==}
engines: {node: '>=12.20'}
- qs@6.11.0:
- resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
+ qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
engines: {node: '>=0.6'}
- querystringify@2.2.0:
- resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
-
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -4623,8 +4547,8 @@ packages:
react-is@18.3.1:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
- react-json-view-lite@1.4.0:
- resolution: {integrity: sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==}
+ react-json-view-lite@1.5.0:
+ resolution: {integrity: sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==}
engines: {node: '>=14'}
peerDependencies:
react: ^16.13.1 || ^17.0.0 || ^18.0.0
@@ -4684,6 +4608,18 @@ packages:
resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
engines: {node: '>= 0.10'}
+ recma-build-jsx@1.0.0:
+ resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
+
+ recma-jsx@1.0.0:
+ resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==}
+
+ recma-parse@1.0.0:
+ resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
+
+ recma-stringify@1.0.0:
+ resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
+
recursive-readdir@2.2.3:
resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==}
engines: {node: '>=6.0.0'}
@@ -4698,8 +4634,8 @@ packages:
react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0
styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5
- redocusaurus@2.1.1:
- resolution: {integrity: sha512-uaiuSsty0TcYuibabEw72DzN5JL6eF9KTIR5dL61qP7smFwIY8THEsNogzKTfcKCb6MJ8ug4vohrnrANn3K3cg==}
+ redocusaurus@2.1.2:
+ resolution: {integrity: sha512-PqMXxmjAyQ78zdI9W5lUI21a9N9bXDQYj5NuTcjG5xmyn63+KfqF+ugmqh7FbY3Fr9Sud14X6ZDoRGdwVtBDew==}
engines: {node: '>=14'}
peerDependencies:
'@docusaurus/theme-common': ^3.0.0
@@ -4708,8 +4644,8 @@ packages:
reftools@1.1.9:
resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==}
- regenerate-unicode-properties@10.1.1:
- resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==}
+ regenerate-unicode-properties@10.2.0:
+ resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==}
engines: {node: '>=4'}
regenerate@1.4.2:
@@ -4721,12 +4657,12 @@ packages:
regenerator-transform@0.15.2:
resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
- regexp.prototype.flags@1.5.2:
- resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
+ regexp.prototype.flags@1.5.3:
+ resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==}
engines: {node: '>= 0.4'}
- regexpu-core@5.3.2:
- resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==}
+ regexpu-core@6.1.1:
+ resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==}
engines: {node: '>=4'}
registry-auth-token@5.0.2:
@@ -4737,13 +4673,19 @@ packages:
resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==}
engines: {node: '>=12'}
- regjsparser@0.9.1:
- resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
+ regjsgen@0.8.0:
+ resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+
+ regjsparser@0.11.1:
+ resolution: {integrity: sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==}
hasBin: true
rehype-raw@7.0.0:
resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
+ rehype-recma@1.0.0:
+ resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
+
relateurl@0.2.7:
resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
engines: {node: '>= 0.10'}
@@ -4764,11 +4706,14 @@ packages:
remark-mdx@3.0.1:
resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==}
+ remark-mdx@3.1.0:
+ resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==}
+
remark-parse@11.0.0:
resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
- remark-rehype@11.1.0:
- resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==}
+ remark-rehype@11.1.1:
+ resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==}
remark-stringify@11.0.0:
resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
@@ -4828,9 +4773,6 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
- rrweb-cssom@0.6.0:
- resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
-
rrweb-cssom@0.7.1:
resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
@@ -4840,8 +4782,8 @@ packages:
rtl-detect@1.1.2:
resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==}
- rtlcss@4.1.1:
- resolution: {integrity: sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==}
+ rtlcss@4.3.0:
+ resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==}
engines: {node: '>=12.0.0'}
hasBin: true
@@ -4890,8 +4832,8 @@ packages:
resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==}
engines: {node: '>= 12.13.0'}
- search-insights@2.14.0:
- resolution: {integrity: sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==}
+ search-insights@2.17.2:
+ resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==}
section-matter@1.0.0:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
@@ -4912,27 +4854,27 @@ packages:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
- semver@7.6.2:
- resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'}
hasBin: true
- send@0.18.0:
- resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
+ send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
engines: {node: '>= 0.8.0'}
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
- serve-handler@6.1.5:
- resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==}
+ serve-handler@6.1.6:
+ resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==}
serve-index@1.9.1:
resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==}
engines: {node: '>= 0.8.0'}
- serve-static@1.15.0:
- resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
+ serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
engines: {node: '>= 0.8.0'}
set-function-length@1.2.2:
@@ -5038,8 +4980,8 @@ packages:
source-list-map@2.0.1:
resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==}
- source-map-js@1.2.0:
- resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
source-map-support@0.5.21:
@@ -5056,9 +4998,6 @@ packages:
space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
- spawn-command@0.0.2:
- resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==}
-
spdy-transport@3.0.0:
resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
@@ -5146,11 +5085,11 @@ packages:
style-to-object@0.4.4:
resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
- style-to-object@1.0.6:
- resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==}
+ style-to-object@1.0.8:
+ resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==}
- styled-components@6.1.11:
- resolution: {integrity: sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==}
+ styled-components@6.1.13:
+ resolution: {integrity: sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==}
engines: {node: '>= 16'}
peerDependencies:
react: '>= 16.8.0'
@@ -5165,10 +5104,6 @@ packages:
stylis@4.3.2:
resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==}
- supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
-
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -5220,8 +5155,8 @@ packages:
uglify-js:
optional: true
- terser@5.31.1:
- resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==}
+ terser@5.36.0:
+ resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==}
engines: {node: '>=10'}
hasBin: true
@@ -5237,9 +5172,12 @@ packages:
tiny-warning@1.0.3:
resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
- to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
+ tldts-core@6.1.50:
+ resolution: {integrity: sha512-na2EcZqmdA2iV9zHV7OHQDxxdciEpxrjbkp+aHmZgnZKHzoElLajP59np5/4+sare9fQBfixgvXKx8ev1d7ytw==}
+
+ tldts@6.1.50:
+ resolution: {integrity: sha512-q9GOap6q3KCsLMdOjXhWU5jVZ8/1dIib898JBRLsN+tBhENpBDcAVQbE0epADOjw11FhQQy9AcbqKGBQPUfTQA==}
+ hasBin: true
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
@@ -5253,9 +5191,9 @@ packages:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
- tough-cookie@4.1.4:
- resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
- engines: {node: '>=6'}
+ tough-cookie@5.0.0:
+ resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==}
+ engines: {node: '>=16'}
tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
@@ -5277,8 +5215,8 @@ packages:
tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
- tslib@2.6.3:
- resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+ tslib@2.8.0:
+ resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==}
type-fest@1.4.0:
resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
@@ -5288,8 +5226,8 @@ packages:
resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
engines: {node: '>=12.20'}
- type-fest@4.21.0:
- resolution: {integrity: sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==}
+ type-fest@4.26.1:
+ resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==}
engines: {node: '>=16'}
type-is@1.6.18:
@@ -5315,19 +5253,23 @@ packages:
typedarray-to-buffer@3.1.5:
resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
- typescript@5.5.3:
- resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
+ typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
engines: {node: '>=14.17'}
hasBin: true
unbox-primitive@1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
- undici-types@5.26.5:
- resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
- unicode-canonical-property-names-ecmascript@2.0.0:
- resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
+ undici@6.20.1:
+ resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==}
+ engines: {node: '>=18.17'}
+
+ unicode-canonical-property-names-ecmascript@2.0.1:
+ resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
engines: {node: '>=4'}
unicode-emoji-modifier-base@1.0.0:
@@ -5338,8 +5280,8 @@ packages:
resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
engines: {node: '>=4'}
- unicode-match-property-value-ecmascript@2.1.0:
- resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==}
+ unicode-match-property-value-ecmascript@2.2.0:
+ resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==}
engines: {node: '>=4'}
unicode-property-aliases-ecmascript@2.1.0:
@@ -5362,9 +5304,6 @@ packages:
unist-util-position@5.0.0:
resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
- unist-util-remove-position@5.0.0:
- resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
-
unist-util-stringify-position@4.0.0:
resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
@@ -5374,10 +5313,6 @@ packages:
unist-util-visit@5.0.0:
resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
- universalify@0.2.0:
- resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
- engines: {node: '>= 4.0.0'}
-
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
@@ -5386,8 +5321,8 @@ packages:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
- update-browserslist-db@1.1.0:
- resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
+ update-browserslist-db@1.1.1:
+ resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
@@ -5396,6 +5331,9 @@ packages:
resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==}
engines: {node: '>=14.16'}
+ uri-js-replace@1.0.1:
+ resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==}
+
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -5409,9 +5347,6 @@ packages:
file-loader:
optional: true
- url-parse@1.5.10:
- resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
-
url-template@2.0.8:
resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==}
@@ -5445,21 +5380,21 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
- vfile-location@5.0.2:
- resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==}
+ vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
vfile-message@4.0.2:
resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
- vfile@6.0.1:
- resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==}
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
w3c-xmlserializer@5.0.0:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'}
- watchpack@2.4.1:
- resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==}
+ watchpack@2.4.2:
+ resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
engines: {node: '>=10.13.0'}
wbuf@1.7.3:
@@ -5510,8 +5445,8 @@ packages:
resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
engines: {node: '>=10.13.0'}
- webpack@5.92.1:
- resolution: {integrity: sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==}
+ webpack@5.95.0:
+ resolution: {integrity: sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==}
engines: {node: '>=10.13.0'}
hasBin: true
peerDependencies:
@@ -5639,8 +5574,8 @@ packages:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
- yaml@2.4.5:
- resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==}
+ yaml@2.6.0:
+ resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==}
engines: {node: '>= 14'}
hasBin: true
@@ -5665,19 +5600,19 @@ packages:
snapshots:
- '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.14.0)':
+ '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.17.2)':
dependencies:
- '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.14.0)
+ '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.17.2)
'@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)
transitivePeerDependencies:
- '@algolia/client-search'
- algoliasearch
- search-insights
- '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.14.0)':
+ '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.17.2)':
dependencies:
'@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)
- search-insights: 2.14.0
+ search-insights: 2.17.2
transitivePeerDependencies:
- '@algolia/client-search'
- algoliasearch
@@ -5776,867 +5711,762 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
- '@babel/code-frame@7.24.7':
+ '@babel/code-frame@7.26.0':
dependencies:
- '@babel/highlight': 7.24.7
- picocolors: 1.0.1
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
- '@babel/compat-data@7.24.7': {}
+ '@babel/compat-data@7.26.0': {}
- '@babel/core@7.24.7':
+ '@babel/core@7.26.0':
dependencies:
'@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.24.7
- '@babel/helper-compilation-targets': 7.24.7
- '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
- '@babel/helpers': 7.24.7
- '@babel/parser': 7.24.7
- '@babel/template': 7.24.7
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/code-frame': 7.26.0
+ '@babel/generator': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helpers': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
convert-source-map: 2.0.0
- debug: 4.3.5
+ debug: 4.3.7
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- '@babel/generator@7.24.7':
+ '@babel/generator@7.26.0':
dependencies:
- '@babel/types': 7.24.7
+ '@babel/parser': 7.26.1
+ '@babel/types': 7.26.0
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
- jsesc: 2.5.2
+ jsesc: 3.0.2
- '@babel/helper-annotate-as-pure@7.24.7':
+ '@babel/helper-annotate-as-pure@7.25.9':
dependencies:
- '@babel/types': 7.24.7
+ '@babel/types': 7.26.0
- '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7':
+ '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9':
dependencies:
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
transitivePeerDependencies:
- supports-color
- '@babel/helper-compilation-targets@7.24.7':
+ '@babel/helper-compilation-targets@7.25.9':
dependencies:
- '@babel/compat-data': 7.24.7
- '@babel/helper-validator-option': 7.24.7
- browserslist: 4.23.1
+ '@babel/compat-data': 7.26.0
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.2
lru-cache: 5.1.1
semver: 6.3.1
- '@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.24.7)':
+ '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-annotate-as-pure': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-function-name': 7.24.7
- '@babel/helper-member-expression-to-functions': 7.24.7
- '@babel/helper-optimise-call-expression': 7.24.7
- '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/traverse': 7.25.9
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- '@babel/helper-create-regexp-features-plugin@7.24.7(@babel/core@7.24.7)':
+ '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-annotate-as-pure': 7.24.7
- regexpu-core: 5.3.2
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ regexpu-core: 6.1.1
semver: 6.3.1
- '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.7)':
+ '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-compilation-targets': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- debug: 4.3.5
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ debug: 4.3.7
lodash.debounce: 4.0.8
resolve: 1.22.8
transitivePeerDependencies:
- supports-color
- '@babel/helper-environment-visitor@7.24.7':
+ '@babel/helper-member-expression-to-functions@7.25.9':
dependencies:
- '@babel/types': 7.24.7
-
- '@babel/helper-function-name@7.24.7':
- dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.7
-
- '@babel/helper-hoist-variables@7.24.7':
- dependencies:
- '@babel/types': 7.24.7
-
- '@babel/helper-member-expression-to-functions@7.24.7':
- dependencies:
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-imports@7.24.7':
+ '@babel/helper-module-imports@7.25.9':
dependencies:
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)':
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-module-imports': 7.24.7
- '@babel/helper-simple-access': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/helper-optimise-call-expression@7.24.7':
+ '@babel/helper-optimise-call-expression@7.25.9':
dependencies:
- '@babel/types': 7.24.7
+ '@babel/types': 7.26.0
- '@babel/helper-plugin-utils@7.24.7': {}
+ '@babel/helper-plugin-utils@7.25.9': {}
- '@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.7)':
+ '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-annotate-as-pure': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-wrap-function': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-wrap-function': 7.25.9
+ '@babel/traverse': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7)':
+ '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-member-expression-to-functions': 7.24.7
- '@babel/helper-optimise-call-expression': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/traverse': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/helper-simple-access@7.24.7':
+ '@babel/helper-simple-access@7.25.9':
dependencies:
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
transitivePeerDependencies:
- supports-color
- '@babel/helper-skip-transparent-expression-wrappers@7.24.7':
+ '@babel/helper-skip-transparent-expression-wrappers@7.25.9':
dependencies:
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
transitivePeerDependencies:
- supports-color
- '@babel/helper-split-export-declaration@7.24.7':
+ '@babel/helper-string-parser@7.25.9': {}
+
+ '@babel/helper-validator-identifier@7.25.9': {}
+
+ '@babel/helper-validator-option@7.25.9': {}
+
+ '@babel/helper-wrap-function@7.25.9':
dependencies:
- '@babel/types': 7.24.7
-
- '@babel/helper-string-parser@7.24.7': {}
-
- '@babel/helper-validator-identifier@7.24.7': {}
-
- '@babel/helper-validator-option@7.24.7': {}
-
- '@babel/helper-wrap-function@7.24.7':
- dependencies:
- '@babel/helper-function-name': 7.24.7
- '@babel/template': 7.24.7
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
transitivePeerDependencies:
- supports-color
- '@babel/helpers@7.24.7':
+ '@babel/helpers@7.26.0':
dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
- '@babel/highlight@7.24.7':
+ '@babel/parser@7.26.1':
dependencies:
- '@babel/helper-validator-identifier': 7.24.7
- chalk: 2.4.2
- js-tokens: 4.0.0
- picocolors: 1.0.1
+ '@babel/types': 7.26.0
- '@babel/parser@7.24.7':
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/types': 7.24.7
-
- '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
- '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/traverse': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7)':
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)':
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-async-generator-functions@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-module-imports': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/traverse': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
- '@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0)
+ '@babel/traverse': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-classes@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-annotate-as-pure': 7.24.7
- '@babel/helper-compilation-targets': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-function-name': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-split-export-declaration': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
+ '@babel/traverse': 7.25.9
globals: 11.12.0
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/template': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/template': 7.25.9
- '@babel/plugin-transform-destructuring@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-function-name@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-compilation-targets': 7.24.7
- '@babel/helper-function-name': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7)
-
- '@babel/plugin-transform-literals@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7)
-
- '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/traverse': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-modules-commonjs@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-simple-access': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-hoist-variables': 7.24.7
- '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-simple-access': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7)
-
- '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7)
-
- '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-compilation-targets': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7)
-
- '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-optional-chaining@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0)
+
+ '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-annotate-as-pure': 7.24.7
- '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-react-constant-elements@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
-
- '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-annotate-as-pure': 7.24.7
- '@babel/helper-module-imports': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7)
- '@babel/types': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-react-constant-elements@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-annotate-as-pure': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
- '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
regenerator-transform: 0.15.2
- '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-runtime@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-module-imports': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.7)
- babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7)
- babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+
+ '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0)
+ babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0)
+ babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0)
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-typeof-symbol@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-typescript@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-annotate-as-pure': 7.24.7
- '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.7)':
+ '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7)
- '@babel/helper-plugin-utils': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
- '@babel/preset-env@7.24.7(@babel/core@7.24.7)':
+ '@babel/preset-env@7.26.0(@babel/core@7.26.0)':
dependencies:
- '@babel/compat-data': 7.24.7
- '@babel/core': 7.24.7
- '@babel/helper-compilation-targets': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-validator-option': 7.24.7
- '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7)
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7)
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7)
- '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.7)
- '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-async-generator-functions': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-block-scoping': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-classes': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-destructuring': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-function-name': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-literals': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-modules-systemjs': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-typeof-symbol': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.24.7)
- '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.7)
- babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.7)
- babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7)
- babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.7)
- core-js-compat: 3.37.1
+ '@babel/compat-data': 7.26.0
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-option': 7.25.9
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0)
+ '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0)
+ babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0)
+ babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0)
+ babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0)
+ core-js-compat: 3.38.1
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.7)':
+ '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/types': 7.26.0
esutils: 2.0.3
- '@babel/preset-react@7.24.7(@babel/core@7.24.7)':
+ '@babel/preset-react@7.25.9(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-validator-option': 7.24.7
- '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-option': 7.25.9
+ '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
- '@babel/preset-typescript@7.24.7(@babel/core@7.24.7)':
+ '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-plugin-utils': 7.24.7
- '@babel/helper-validator-option': 7.24.7
- '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7)
- '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-option': 7.25.9
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
- '@babel/regjsgen@0.8.0': {}
-
- '@babel/runtime-corejs3@7.24.7':
+ '@babel/runtime-corejs3@7.26.0':
dependencies:
- core-js-pure: 3.37.1
+ core-js-pure: 3.38.1
regenerator-runtime: 0.14.1
- '@babel/runtime@7.24.7':
+ '@babel/runtime@7.26.0':
dependencies:
regenerator-runtime: 0.14.1
- '@babel/template@7.24.7':
+ '@babel/template@7.25.9':
dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/parser': 7.24.7
- '@babel/types': 7.24.7
+ '@babel/code-frame': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/types': 7.26.0
- '@babel/traverse@7.24.7':
+ '@babel/traverse@7.25.9':
dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-function-name': 7.24.7
- '@babel/helper-hoist-variables': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
- '@babel/parser': 7.24.7
- '@babel/types': 7.24.7
- debug: 4.3.5
+ '@babel/code-frame': 7.26.0
+ '@babel/generator': 7.26.0
+ '@babel/parser': 7.26.1
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+ debug: 4.3.7
globals: 11.12.0
transitivePeerDependencies:
- supports-color
- '@babel/types@7.24.7':
+ '@babel/types@7.26.0':
dependencies:
- '@babel/helper-string-parser': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
- to-fast-properties: 2.0.0
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
'@cfaester/enzyme-adapter-react-18@0.8.0(enzyme@3.11.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
@@ -6654,42 +6484,43 @@ snapshots:
'@discoveryjs/json-ext@0.5.7': {}
- '@docsearch/css@3.6.0': {}
+ '@docsearch/css@3.6.2': {}
- '@docsearch/react@3.6.0(@algolia/client-search@4.24.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)':
+ '@docsearch/react@3.6.2(@algolia/client-search@4.24.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)':
dependencies:
- '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.14.0)
+ '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.17.2)
'@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)
- '@docsearch/css': 3.6.0
+ '@docsearch/css': 3.6.2
algoliasearch: 4.24.0
optionalDependencies:
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- search-insights: 2.14.0
+ search-insights: 2.17.2
transitivePeerDependencies:
- '@algolia/client-search'
- '@docusaurus/core@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/core@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/generator': 7.24.7
- '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7)
- '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.24.7)
- '@babel/preset-env': 7.24.7(@babel/core@7.24.7)
- '@babel/preset-react': 7.24.7(@babel/core@7.24.7)
- '@babel/preset-typescript': 7.24.7(@babel/core@7.24.7)
- '@babel/runtime': 7.24.7
- '@babel/runtime-corejs3': 7.24.7
- '@babel/traverse': 7.24.7
- '@docusaurus/cssnano-preset': 3.4.0
- '@docusaurus/logger': 3.4.0
- '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- autoprefixer: 10.4.19(postcss@8.4.39)
- babel-loader: 9.1.3(@babel/core@7.24.7)(webpack@5.92.1)
+ '@babel/core': 7.26.0
+ '@babel/generator': 7.26.0
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-env': 7.26.0(@babel/core@7.26.0)
+ '@babel/preset-react': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0)
+ '@babel/runtime': 7.26.0
+ '@babel/runtime-corejs3': 7.26.0
+ '@babel/traverse': 7.25.9
+ '@docusaurus/cssnano-preset': 3.5.2
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@mdx-js/react': 3.1.0(@types/react@18.3.12)(react@18.3.1)
+ autoprefixer: 10.4.20(postcss@8.4.47)
+ babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.95.0)
babel-plugin-dynamic-import-node: 2.3.3
boxen: 6.2.1
chalk: 4.1.2
@@ -6698,56 +6529,57 @@ snapshots:
cli-table3: 0.6.5
combine-promises: 1.2.0
commander: 5.1.0
- copy-webpack-plugin: 11.0.0(webpack@5.92.1)
- core-js: 3.37.1
- css-loader: 6.11.0(webpack@5.92.1)
- css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.92.1)
- cssnano: 6.1.2(postcss@8.4.39)
+ copy-webpack-plugin: 11.0.0(webpack@5.95.0)
+ core-js: 3.38.1
+ css-loader: 6.11.0(webpack@5.95.0)
+ css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.95.0)
+ cssnano: 6.1.2(postcss@8.4.47)
del: 6.1.1
detect-port: 1.6.1
escape-html: 1.0.3
eta: 2.2.0
eval: 0.1.8
- file-loader: 6.2.0(webpack@5.92.1)
+ file-loader: 6.2.0(webpack@5.95.0)
fs-extra: 11.2.0
html-minifier-terser: 7.2.0
html-tags: 3.3.1
- html-webpack-plugin: 5.6.0(webpack@5.92.1)
+ html-webpack-plugin: 5.6.3(webpack@5.95.0)
leven: 3.1.0
lodash: 4.17.21
- mini-css-extract-plugin: 2.9.0(webpack@5.92.1)
+ mini-css-extract-plugin: 2.9.1(webpack@5.95.0)
p-map: 4.0.0
- postcss: 8.4.39
- postcss-loader: 7.3.4(postcss@8.4.39)(typescript@5.5.3)(webpack@5.92.1)
+ postcss: 8.4.47
+ postcss-loader: 7.3.4(postcss@8.4.47)(typescript@5.6.3)(webpack@5.95.0)
prompts: 2.4.2
react: 18.3.1
- react-dev-utils: 12.0.1(typescript@5.5.3)(webpack@5.92.1)
+ react-dev-utils: 12.0.1(typescript@5.6.3)(webpack@5.95.0)
react-dom: 18.3.1(react@18.3.1)
react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)'
- react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.92.1)
+ react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0)
react-router: 5.3.4(react@18.3.1)
react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1)
react-router-dom: 5.3.4(react@18.3.1)
rtl-detect: 1.1.2
- semver: 7.6.2
- serve-handler: 6.1.5
+ semver: 7.6.3
+ serve-handler: 6.1.6
shelljs: 0.8.5
- terser-webpack-plugin: 5.3.10(webpack@5.92.1)
- tslib: 2.6.3
+ terser-webpack-plugin: 5.3.10(webpack@5.95.0)
+ tslib: 2.8.0
update-notifier: 6.0.2
- url-loader: 4.1.1(file-loader@6.2.0(webpack@5.92.1))(webpack@5.92.1)
- webpack: 5.92.1
+ url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0)
+ webpack: 5.95.0
webpack-bundle-analyzer: 4.10.2
- webpack-dev-server: 4.15.2(debug@4.3.5)(webpack@5.92.1)
+ webpack-dev-server: 4.15.2(debug@4.3.7)(webpack@5.95.0)
webpack-merge: 5.10.0
- webpackbar: 5.0.2(webpack@5.92.1)
+ webpackbar: 5.0.2(webpack@5.95.0)
transitivePeerDependencies:
- '@docusaurus/types'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- debug
@@ -6761,28 +6593,28 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/cssnano-preset@3.4.0':
+ '@docusaurus/cssnano-preset@3.5.2':
dependencies:
- cssnano-preset-advanced: 6.1.2(postcss@8.4.39)
- postcss: 8.4.39
- postcss-sort-media-queries: 5.2.0(postcss@8.4.39)
- tslib: 2.6.3
+ cssnano-preset-advanced: 6.1.2(postcss@8.4.47)
+ postcss: 8.4.47
+ postcss-sort-media-queries: 5.2.0(postcss@8.4.47)
+ tslib: 2.8.0
- '@docusaurus/logger@3.4.0':
+ '@docusaurus/logger@3.5.2':
dependencies:
chalk: 4.1.2
- tslib: 2.6.3
+ tslib: 2.8.0
- '@docusaurus/mdx-loader@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/logger': 3.4.0
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@mdx-js/mdx': 3.0.1
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@mdx-js/mdx': 3.1.0(acorn@8.13.0)
'@slorber/remark-comment': 1.0.0
escape-html: 1.0.3
estree-util-value-to-estree: 3.1.2
- file-loader: 6.2.0(webpack@5.92.1)
+ file-loader: 6.2.0(webpack@5.95.0)
fs-extra: 11.2.0
image-size: 1.1.1
mdast-util-mdx: 3.0.0
@@ -6795,26 +6627,27 @@ snapshots:
remark-frontmatter: 5.0.0
remark-gfm: 4.0.0
stringify-object: 3.3.0
- tslib: 2.6.3
+ tslib: 2.8.0
unified: 11.0.5
unist-util-visit: 5.0.0
- url-loader: 4.1.1(file-loader@6.2.0(webpack@5.92.1))(webpack@5.92.1)
- vfile: 6.0.1
- webpack: 5.92.1
+ url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0)
+ vfile: 6.0.3
+ webpack: 5.95.0
transitivePeerDependencies:
- '@docusaurus/types'
- '@swc/core'
+ - acorn
- esbuild
- supports-color
- typescript
- uglify-js
- webpack-cli
- '@docusaurus/module-type-aliases@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@docusaurus/module-type-aliases@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/history': 4.7.11
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
'@types/react-router-config': 5.0.11
'@types/react-router-dom': 5.3.3
react: 18.3.1
@@ -6828,15 +6661,17 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/plugin-content-blog@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/logger': 3.4.0
- '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
cheerio: 1.0.0-rc.12
feed: 4.2.2
fs-extra: 11.2.0
@@ -6845,15 +6680,17 @@ snapshots:
react-dom: 18.3.1(react@18.3.1)
reading-time: 1.5.0
srcset: 4.0.0
- tslib: 2.6.3
+ tslib: 2.8.0
unist-util-visit: 5.0.0
utility-types: 3.11.0
- webpack: 5.92.1
+ webpack: 5.95.0
transitivePeerDependencies:
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- debug
@@ -6867,16 +6704,17 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-content-docs@3.4.0(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/logger': 3.4.0
- '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/module-type-aliases': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
'@types/react-router-config': 5.0.11
combine-promises: 1.2.0
fs-extra: 11.2.0
@@ -6884,14 +6722,16 @@ snapshots:
lodash: 4.17.21
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- tslib: 2.6.3
+ tslib: 2.8.0
utility-types: 3.11.0
- webpack: 5.92.1
+ webpack: 5.95.0
transitivePeerDependencies:
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- debug
@@ -6905,23 +6745,25 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-content-pages@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
fs-extra: 11.2.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- tslib: 2.6.3
- webpack: 5.92.1
+ tslib: 2.8.0
+ webpack: 5.95.0
transitivePeerDependencies:
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- debug
@@ -6935,21 +6777,23 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-debug@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
fs-extra: 11.2.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- react-json-view-lite: 1.4.0(react@18.3.1)
- tslib: 2.6.3
+ react-json-view-lite: 1.5.0(react@18.3.1)
+ tslib: 2.8.0
transitivePeerDependencies:
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- debug
@@ -6963,19 +6807,21 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-google-analytics@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- tslib: 2.6.3
+ tslib: 2.8.0
transitivePeerDependencies:
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- debug
@@ -6989,20 +6835,22 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-google-gtag@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
'@types/gtag.js': 0.0.12
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- tslib: 2.6.3
+ tslib: 2.8.0
transitivePeerDependencies:
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- debug
@@ -7016,19 +6864,21 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-google-tag-manager@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- tslib: 2.6.3
+ tslib: 2.8.0
transitivePeerDependencies:
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- debug
@@ -7042,24 +6892,26 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-sitemap@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/logger': 3.4.0
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
fs-extra: 11.2.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
sitemap: 7.1.2
- tslib: 2.6.3
+ tslib: 2.8.0
transitivePeerDependencies:
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- debug
@@ -7073,30 +6925,32 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/preset-classic@3.4.0(@algolia/client-search@4.24.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.5.3)':
+ '@docusaurus/preset-classic@3.5.2(@algolia/client-search@4.24.0)(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-content-blog': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-content-docs': 3.4.0(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-content-pages': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-debug': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-google-analytics': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-google-gtag': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-google-tag-manager': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-sitemap': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/theme-classic': 3.4.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/theme-search-algolia': 3.4.0(@algolia/client-search@4.24.0)(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.5.3)
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.12)(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
transitivePeerDependencies:
- '@algolia/client-search'
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
- '@types/react'
+ - acorn
- bufferutil
- csso
- debug
@@ -7113,37 +6967,37 @@ snapshots:
'@docusaurus/react-loadable@6.0.0(react@18.3.1)':
dependencies:
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
react: 18.3.1
- '@docusaurus/theme-classic@3.4.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/theme-classic@3.5.2(@types/react@18.3.12)(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/module-type-aliases': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/plugin-content-blog': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-content-docs': 3.4.0(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-content-pages': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/theme-translations': 3.4.0
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@mdx-js/react': 3.0.1(@types/react@18.3.3)(react@18.3.1)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-translations': 3.5.2
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@mdx-js/react': 3.1.0(@types/react@18.3.12)(react@18.3.1)
clsx: 2.1.1
copy-text-to-clipboard: 3.2.0
- infima: 0.2.0-alpha.43
+ infima: 0.2.0-alpha.44
lodash: 4.17.21
nprogress: 0.2.0
- postcss: 8.4.39
- prism-react-renderer: 2.3.1(react@18.3.1)
+ postcss: 8.4.47
+ prism-react-renderer: 2.4.0(react@18.3.1)
prismjs: 1.29.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-router-dom: 5.3.4(react@18.3.1)
- rtlcss: 4.1.1
- tslib: 2.6.3
+ rtlcss: 4.3.0
+ tslib: 2.8.0
utility-types: 3.11.0
transitivePeerDependencies:
- '@parcel/css'
@@ -7151,6 +7005,7 @@ snapshots:
- '@swc/core'
- '@swc/css'
- '@types/react'
+ - acorn
- bufferutil
- csso
- debug
@@ -7164,72 +7019,63 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/theme-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/mdx-loader': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/module-type-aliases': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/plugin-content-blog': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-content-docs': 3.4.0(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/plugin-content-pages': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
'@types/history': 4.7.11
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
'@types/react-router-config': 5.0.11
clsx: 2.1.1
parse-numeric-range: 1.3.0
- prism-react-renderer: 2.3.1(react@18.3.1)
+ prism-react-renderer: 2.4.0(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- tslib: 2.6.3
+ tslib: 2.8.0
utility-types: 3.11.0
transitivePeerDependencies:
- '@docusaurus/types'
- - '@parcel/css'
- - '@rspack/core'
- '@swc/core'
- - '@swc/css'
- - bufferutil
- - csso
- - debug
+ - acorn
- esbuild
- - eslint
- - lightningcss
- supports-color
- typescript
- uglify-js
- - utf-8-validate
- - vue-template-compiler
- webpack-cli
- '@docusaurus/theme-search-algolia@3.4.0(@algolia/client-search@4.24.0)(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)(typescript@5.5.3)':
+ '@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@4.24.0)(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)(typescript@5.6.3)':
dependencies:
- '@docsearch/react': 3.6.0(@algolia/client-search@4.24.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.14.0)
- '@docusaurus/core': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/logger': 3.4.0
- '@docusaurus/plugin-content-docs': 3.4.0(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/theme-translations': 3.4.0
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docsearch/react': 3.6.2(@algolia/client-search@4.24.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.2)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-translations': 3.5.2
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
algoliasearch: 4.24.0
- algoliasearch-helper: 3.22.2(algoliasearch@4.24.0)
+ algoliasearch-helper: 3.22.5(algoliasearch@4.24.0)
clsx: 2.1.1
eta: 2.2.0
fs-extra: 11.2.0
lodash: 4.17.21
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- tslib: 2.6.3
+ tslib: 2.8.0
utility-types: 3.11.0
transitivePeerDependencies:
- '@algolia/client-search'
- '@docusaurus/types'
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
- '@types/react'
+ - acorn
- bufferutil
- csso
- debug
@@ -7244,25 +7090,25 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/theme-translations@3.4.0':
+ '@docusaurus/theme-translations@3.5.2':
dependencies:
fs-extra: 11.2.0
- tslib: 2.6.3
+ tslib: 2.8.0
- '@docusaurus/tsconfig@3.4.0': {}
+ '@docusaurus/tsconfig@3.5.2': {}
- '@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@mdx-js/mdx': 3.0.1
'@types/history': 4.7.11
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
commander: 5.1.0
joi: 17.13.3
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
utility-types: 3.11.0
- webpack: 5.92.1
+ webpack: 5.95.0
webpack-merge: 5.10.0
transitivePeerDependencies:
- '@swc/core'
@@ -7271,22 +7117,22 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/utils-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))':
+ '@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.0
optionalDependencies:
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)':
+ '@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)':
dependencies:
- '@docusaurus/logger': 3.4.0
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
fs-extra: 11.2.0
joi: 17.13.3
js-yaml: 4.1.0
lodash: 4.17.21
- tslib: 2.6.3
+ tslib: 2.8.0
transitivePeerDependencies:
- '@docusaurus/types'
- '@swc/core'
@@ -7296,13 +7142,13 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)':
+ '@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)':
dependencies:
- '@docusaurus/logger': 3.4.0
- '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- '@svgr/webpack': 8.1.0(typescript@5.5.3)
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@svgr/webpack': 8.1.0(typescript@5.6.3)
escape-string-regexp: 4.0.0
- file-loader: 6.2.0(webpack@5.92.1)
+ file-loader: 6.2.0(webpack@5.95.0)
fs-extra: 11.2.0
github-slugger: 1.5.0
globby: 11.1.0
@@ -7310,16 +7156,16 @@ snapshots:
jiti: 1.21.6
js-yaml: 4.1.0
lodash: 4.17.21
- micromatch: 4.0.7
+ micromatch: 4.0.8
prompts: 2.4.2
resolve-pathname: 3.0.0
shelljs: 0.8.5
- tslib: 2.6.3
- url-loader: 4.1.1(file-loader@6.2.0(webpack@5.92.1))(webpack@5.92.1)
+ tslib: 2.8.0
+ url-loader: 4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0)
utility-types: 3.11.0
- webpack: 5.92.1
+ webpack: 5.95.0
optionalDependencies:
- '@docusaurus/types': 3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/types': 3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
transitivePeerDependencies:
- '@swc/core'
- esbuild
@@ -7333,19 +7179,19 @@ snapshots:
cssesc: 3.0.0
immediate: 3.3.0
- '@easyops-cn/docusaurus-search-local@0.44.2(@docusaurus/theme-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)':
+ '@easyops-cn/docusaurus-search-local@0.45.0(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/plugin-content-docs': 3.4.0(debug@4.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/theme-translations': 3.4.0
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- '@docusaurus/utils-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- '@docusaurus/utils-validation': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(debug@4.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-translations': 3.5.2
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
'@easyops-cn/autocomplete.js': 0.38.1
- '@node-rs/jieba': 1.10.3
- cheerio: 1.0.0-rc.12
+ '@node-rs/jieba': 1.10.4
+ cheerio: 1.0.0
clsx: 1.2.1
- debug: 4.3.5
+ debug: 4.3.7
fs-extra: 10.1.0
klaw-sync: 6.0.0
lunr: 2.3.9
@@ -7353,13 +7199,15 @@ snapshots:
mark.js: 8.11.1
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- tslib: 2.6.3
+ tslib: 2.8.0
transitivePeerDependencies:
- '@docusaurus/types'
+ - '@mdx-js/react'
- '@parcel/css'
- '@rspack/core'
- '@swc/core'
- '@swc/css'
+ - acorn
- bufferutil
- csso
- esbuild
@@ -7372,20 +7220,20 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@emnapi/core@1.2.0':
+ '@emnapi/core@1.3.1':
dependencies:
'@emnapi/wasi-threads': 1.0.1
- tslib: 2.6.3
+ tslib: 2.8.0
optional: true
- '@emnapi/runtime@1.2.0':
+ '@emnapi/runtime@1.3.1':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.0
optional: true
'@emnapi/wasi-threads@1.0.1':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.0
optional: true
'@emotion/is-prop-valid@1.2.2':
@@ -7482,14 +7330,14 @@ snapshots:
'@jest/schemas': 29.6.3
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 3.0.4
- '@types/node': 20.14.10
- '@types/yargs': 17.0.32
+ '@types/node': 20.17.2
+ '@types/yargs': 17.0.33
chalk: 4.1.2
'@jridgewell/gen-mapping@0.3.5':
dependencies:
'@jridgewell/set-array': 1.2.1
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/resolve-uri@3.1.2': {}
@@ -7501,18 +7349,18 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
- '@jridgewell/sourcemap-codec@1.4.15': {}
+ '@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
'@leichtgewicht/ip-codec@2.0.5': {}
'@mdx-js/mdx@3.0.1':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
'@types/estree-jsx': 1.0.5
'@types/hast': 3.0.4
'@types/mdx': 2.0.13
@@ -7528,89 +7376,119 @@ snapshots:
periscopic: 3.1.0
remark-mdx: 3.0.1
remark-parse: 11.0.0
- remark-rehype: 11.1.0
+ remark-rehype: 11.1.1
source-map: 0.7.4
unified: 11.0.5
unist-util-position-from-estree: 2.0.0
unist-util-stringify-position: 4.0.0
unist-util-visit: 5.0.0
- vfile: 6.0.1
+ vfile: 6.0.3
transitivePeerDependencies:
- supports-color
- '@mdx-js/react@3.0.1(@types/react@18.3.3)(react@18.3.1)':
+ '@mdx-js/mdx@3.1.0(acorn@8.13.0)':
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdx': 2.0.13
+ collapse-white-space: 2.1.0
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-util-scope: 1.0.0
+ estree-walker: 3.0.3
+ hast-util-to-jsx-runtime: 2.3.2
+ markdown-extensions: 2.0.0
+ recma-build-jsx: 1.0.0
+ recma-jsx: 1.0.0(acorn@8.13.0)
+ recma-stringify: 1.0.0
+ rehype-recma: 1.0.0
+ remark-mdx: 3.1.0
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.1
+ source-map: 0.7.4
+ unified: 11.0.5
+ unist-util-position-from-estree: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - acorn
+ - supports-color
+
+ '@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1)':
dependencies:
'@types/mdx': 2.0.13
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
react: 18.3.1
- '@napi-rs/wasm-runtime@0.2.4':
+ '@napi-rs/wasm-runtime@0.2.5':
dependencies:
- '@emnapi/core': 1.2.0
- '@emnapi/runtime': 1.2.0
+ '@emnapi/core': 1.3.1
+ '@emnapi/runtime': 1.3.1
'@tybys/wasm-util': 0.9.0
optional: true
- '@node-rs/jieba-android-arm-eabi@1.10.3':
+ '@node-rs/jieba-android-arm-eabi@1.10.4':
optional: true
- '@node-rs/jieba-android-arm64@1.10.3':
+ '@node-rs/jieba-android-arm64@1.10.4':
optional: true
- '@node-rs/jieba-darwin-arm64@1.10.3':
+ '@node-rs/jieba-darwin-arm64@1.10.4':
optional: true
- '@node-rs/jieba-darwin-x64@1.10.3':
+ '@node-rs/jieba-darwin-x64@1.10.4':
optional: true
- '@node-rs/jieba-freebsd-x64@1.10.3':
+ '@node-rs/jieba-freebsd-x64@1.10.4':
optional: true
- '@node-rs/jieba-linux-arm-gnueabihf@1.10.3':
+ '@node-rs/jieba-linux-arm-gnueabihf@1.10.4':
optional: true
- '@node-rs/jieba-linux-arm64-gnu@1.10.3':
+ '@node-rs/jieba-linux-arm64-gnu@1.10.4':
optional: true
- '@node-rs/jieba-linux-arm64-musl@1.10.3':
+ '@node-rs/jieba-linux-arm64-musl@1.10.4':
optional: true
- '@node-rs/jieba-linux-x64-gnu@1.10.3':
+ '@node-rs/jieba-linux-x64-gnu@1.10.4':
optional: true
- '@node-rs/jieba-linux-x64-musl@1.10.3':
+ '@node-rs/jieba-linux-x64-musl@1.10.4':
optional: true
- '@node-rs/jieba-wasm32-wasi@1.10.3':
+ '@node-rs/jieba-wasm32-wasi@1.10.4':
dependencies:
- '@napi-rs/wasm-runtime': 0.2.4
+ '@napi-rs/wasm-runtime': 0.2.5
optional: true
- '@node-rs/jieba-win32-arm64-msvc@1.10.3':
+ '@node-rs/jieba-win32-arm64-msvc@1.10.4':
optional: true
- '@node-rs/jieba-win32-ia32-msvc@1.10.3':
+ '@node-rs/jieba-win32-ia32-msvc@1.10.4':
optional: true
- '@node-rs/jieba-win32-x64-msvc@1.10.3':
+ '@node-rs/jieba-win32-x64-msvc@1.10.4':
optional: true
- '@node-rs/jieba@1.10.3':
+ '@node-rs/jieba@1.10.4':
optionalDependencies:
- '@node-rs/jieba-android-arm-eabi': 1.10.3
- '@node-rs/jieba-android-arm64': 1.10.3
- '@node-rs/jieba-darwin-arm64': 1.10.3
- '@node-rs/jieba-darwin-x64': 1.10.3
- '@node-rs/jieba-freebsd-x64': 1.10.3
- '@node-rs/jieba-linux-arm-gnueabihf': 1.10.3
- '@node-rs/jieba-linux-arm64-gnu': 1.10.3
- '@node-rs/jieba-linux-arm64-musl': 1.10.3
- '@node-rs/jieba-linux-x64-gnu': 1.10.3
- '@node-rs/jieba-linux-x64-musl': 1.10.3
- '@node-rs/jieba-wasm32-wasi': 1.10.3
- '@node-rs/jieba-win32-arm64-msvc': 1.10.3
- '@node-rs/jieba-win32-ia32-msvc': 1.10.3
- '@node-rs/jieba-win32-x64-msvc': 1.10.3
+ '@node-rs/jieba-android-arm-eabi': 1.10.4
+ '@node-rs/jieba-android-arm64': 1.10.4
+ '@node-rs/jieba-darwin-arm64': 1.10.4
+ '@node-rs/jieba-darwin-x64': 1.10.4
+ '@node-rs/jieba-freebsd-x64': 1.10.4
+ '@node-rs/jieba-linux-arm-gnueabihf': 1.10.4
+ '@node-rs/jieba-linux-arm64-gnu': 1.10.4
+ '@node-rs/jieba-linux-arm64-musl': 1.10.4
+ '@node-rs/jieba-linux-x64-gnu': 1.10.4
+ '@node-rs/jieba-linux-x64-musl': 1.10.4
+ '@node-rs/jieba-wasm32-wasi': 1.10.4
+ '@node-rs/jieba-win32-arm64-msvc': 1.10.4
+ '@node-rs/jieba-win32-ia32-msvc': 1.10.4
+ '@node-rs/jieba-win32-x64-msvc': 1.10.4
'@nodelib/fs.scandir@2.1.5':
dependencies:
@@ -7630,27 +7508,27 @@ snapshots:
dependencies:
graceful-fs: 4.2.10
- '@pnpm/npm-conf@2.2.2':
+ '@pnpm/npm-conf@2.3.1':
dependencies:
'@pnpm/config.env-replace': 1.1.0
'@pnpm/network.ca-file': 1.0.2
config-chain: 1.1.13
- '@polka/url@1.0.0-next.25': {}
+ '@polka/url@1.0.0-next.28': {}
- '@redocly/ajv@8.11.0':
+ '@redocly/ajv@8.11.2':
dependencies:
fast-deep-equal: 3.1.3
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
- uri-js: 4.4.1
+ uri-js-replace: 1.0.1
- '@redocly/config@0.6.2': {}
+ '@redocly/config@0.6.3': {}
'@redocly/openapi-core@1.16.0':
dependencies:
- '@redocly/ajv': 8.11.0
- '@redocly/config': 0.6.2
+ '@redocly/ajv': 8.11.2
+ '@redocly/config': 0.6.3
colorette: 1.4.0
https-proxy-agent: 7.0.5
js-levenshtein: 1.1.6
@@ -7678,7 +7556,7 @@ snapshots:
'@sindresorhus/is@4.6.0': {}
- '@sindresorhus/is@6.3.1': {}
+ '@sindresorhus/is@7.0.1': {}
'@slorber/remark-comment@1.0.0':
dependencies:
@@ -7686,56 +7564,56 @@ snapshots:
micromark-util-character: 1.2.0
micromark-util-symbol: 1.1.0
- '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.24.7)':
+ '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
- '@svgr/babel-preset@8.1.0(@babel/core@7.24.7)':
+ '@svgr/babel-preset@8.1.0(@babel/core@7.26.0)':
dependencies:
- '@babel/core': 7.24.7
- '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.24.7)
- '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.0)
- '@svgr/core@8.1.0(typescript@5.5.3)':
+ '@svgr/core@8.1.0(typescript@5.6.3)':
dependencies:
- '@babel/core': 7.24.7
- '@svgr/babel-preset': 8.1.0(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0)
camelcase: 6.3.0
- cosmiconfig: 8.3.6(typescript@5.5.3)
+ cosmiconfig: 8.3.6(typescript@5.6.3)
snake-case: 3.0.4
transitivePeerDependencies:
- supports-color
@@ -7743,38 +7621,38 @@ snapshots:
'@svgr/hast-util-to-babel-ast@8.0.0':
dependencies:
- '@babel/types': 7.24.7
+ '@babel/types': 7.26.0
entities: 4.5.0
- '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.5.3))':
+ '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))':
dependencies:
- '@babel/core': 7.24.7
- '@svgr/babel-preset': 8.1.0(@babel/core@7.24.7)
- '@svgr/core': 8.1.0(typescript@5.5.3)
+ '@babel/core': 7.26.0
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0)
+ '@svgr/core': 8.1.0(typescript@5.6.3)
'@svgr/hast-util-to-babel-ast': 8.0.0
svg-parser: 2.0.4
transitivePeerDependencies:
- supports-color
- '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.5.3))(typescript@5.5.3)':
+ '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3)':
dependencies:
- '@svgr/core': 8.1.0(typescript@5.5.3)
- cosmiconfig: 8.3.6(typescript@5.5.3)
+ '@svgr/core': 8.1.0(typescript@5.6.3)
+ cosmiconfig: 8.3.6(typescript@5.6.3)
deepmerge: 4.3.1
svgo: 3.3.2
transitivePeerDependencies:
- typescript
- '@svgr/webpack@8.1.0(typescript@5.5.3)':
+ '@svgr/webpack@8.1.0(typescript@5.6.3)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/plugin-transform-react-constant-elements': 7.24.7(@babel/core@7.24.7)
- '@babel/preset-env': 7.24.7(@babel/core@7.24.7)
- '@babel/preset-react': 7.24.7(@babel/core@7.24.7)
- '@babel/preset-typescript': 7.24.7(@babel/core@7.24.7)
- '@svgr/core': 8.1.0(typescript@5.5.3)
- '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.5.3))
- '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.5.3))(typescript@5.5.3)
+ '@babel/core': 7.26.0
+ '@babel/plugin-transform-react-constant-elements': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-env': 7.26.0(@babel/core@7.26.0)
+ '@babel/preset-react': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0)
+ '@svgr/core': 8.1.0(typescript@5.6.3)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3))
+ '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3)
transitivePeerDependencies:
- supports-color
- typescript
@@ -7789,30 +7667,30 @@ snapshots:
'@tybys/wasm-util@0.9.0':
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.0
optional: true
'@types/acorn@4.0.6':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
'@types/body-parser@1.19.5':
dependencies:
'@types/connect': 3.4.38
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/bonjour@3.5.13':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/connect-history-api-fallback@1.5.4':
dependencies:
- '@types/express-serve-static-core': 4.19.5
- '@types/node': 20.14.10
+ '@types/express-serve-static-core': 5.0.1
+ '@types/node': 20.17.2
'@types/connect@3.4.38':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/debug@4.1.12':
dependencies:
@@ -7822,41 +7700,38 @@ snapshots:
dependencies:
'@types/trusted-types': 2.0.7
- '@types/eslint-scope@3.7.7':
- dependencies:
- '@types/eslint': 8.56.10
- '@types/estree': 1.0.5
-
- '@types/eslint@8.56.10':
- dependencies:
- '@types/estree': 1.0.5
- '@types/json-schema': 7.0.15
-
'@types/estree-jsx@1.0.5':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
- '@types/estree@1.0.5': {}
+ '@types/estree@1.0.6': {}
- '@types/express-serve-static-core@4.19.5':
+ '@types/express-serve-static-core@4.19.6':
dependencies:
- '@types/node': 20.14.10
- '@types/qs': 6.9.15
+ '@types/node': 20.17.2
+ '@types/qs': 6.9.16
+ '@types/range-parser': 1.2.7
+ '@types/send': 0.17.4
+
+ '@types/express-serve-static-core@5.0.1':
+ dependencies:
+ '@types/node': 20.17.2
+ '@types/qs': 6.9.16
'@types/range-parser': 1.2.7
'@types/send': 0.17.4
'@types/express@4.17.21':
dependencies:
'@types/body-parser': 1.19.5
- '@types/express-serve-static-core': 4.19.5
- '@types/qs': 6.9.15
+ '@types/express-serve-static-core': 4.19.6
+ '@types/qs': 6.9.16
'@types/serve-static': 1.15.7
'@types/gtag.js@0.0.12': {}
'@types/hast@3.0.4':
dependencies:
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
'@types/history@4.7.11': {}
@@ -7866,9 +7741,9 @@ snapshots:
'@types/http-errors@2.0.4': {}
- '@types/http-proxy@1.17.14':
+ '@types/http-proxy@1.17.15':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/istanbul-lib-coverage@2.0.6': {}
@@ -7884,7 +7759,7 @@ snapshots:
'@types/mdast@4.0.4':
dependencies:
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
'@types/mdx@2.0.13': {}
@@ -7894,60 +7769,60 @@ snapshots:
'@types/node-forge@1.3.11':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/node@17.0.45': {}
- '@types/node@20.14.10':
+ '@types/node@20.17.2':
dependencies:
- undici-types: 5.26.5
+ undici-types: 6.19.8
'@types/parse-json@4.0.2': {}
- '@types/prismjs@1.26.4': {}
+ '@types/prismjs@1.26.5': {}
- '@types/prop-types@15.7.12': {}
+ '@types/prop-types@15.7.13': {}
- '@types/qs@6.9.15': {}
+ '@types/qs@6.9.16': {}
'@types/range-parser@1.2.7': {}
'@types/react-helmet@6.1.11':
dependencies:
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
'@types/react-router-config@5.0.11':
dependencies:
'@types/history': 4.7.11
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
'@types/react-router': 5.1.20
'@types/react-router-dom@5.3.3':
dependencies:
'@types/history': 4.7.11
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
'@types/react-router': 5.1.20
'@types/react-router@5.1.20':
dependencies:
'@types/history': 4.7.11
- '@types/react': 18.3.3
+ '@types/react': 18.3.12
- '@types/react@18.3.3':
+ '@types/react@18.3.12':
dependencies:
- '@types/prop-types': 15.7.12
+ '@types/prop-types': 15.7.13
csstype: 3.1.3
'@types/retry@0.12.0': {}
'@types/sax@1.2.7':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/send@0.17.4':
dependencies:
'@types/mime': 1.3.5
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/serve-index@1.9.4':
dependencies:
@@ -7956,28 +7831,28 @@ snapshots:
'@types/serve-static@1.15.7':
dependencies:
'@types/http-errors': 2.0.4
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/send': 0.17.4
'@types/sockjs@0.3.36':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/stylis@4.2.5': {}
'@types/trusted-types@2.0.7': {}
- '@types/unist@2.0.10': {}
+ '@types/unist@2.0.11': {}
- '@types/unist@3.0.2': {}
+ '@types/unist@3.0.3': {}
- '@types/ws@8.5.10':
+ '@types/ws@8.5.12':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
'@types/yargs-parser@21.0.3': {}
- '@types/yargs@17.0.32':
+ '@types/yargs@17.0.33':
dependencies:
'@types/yargs-parser': 21.0.3
@@ -8068,25 +7943,31 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
- acorn-import-attributes@1.9.5(acorn@8.12.1):
+ acorn-import-attributes@1.9.5(acorn@8.13.0):
dependencies:
- acorn: 8.12.1
+ acorn: 8.13.0
acorn-jsx@5.3.2(acorn@8.12.1):
dependencies:
acorn: 8.12.1
- acorn-walk@8.3.3:
+ acorn-jsx@5.3.2(acorn@8.13.0):
dependencies:
- acorn: 8.12.1
+ acorn: 8.13.0
+
+ acorn-walk@8.3.4:
+ dependencies:
+ acorn: 8.13.0
acorn@8.12.1: {}
+ acorn@8.13.0: {}
+
address@1.2.2: {}
agent-base@7.1.1:
dependencies:
- debug: 4.3.5
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
@@ -8095,17 +7976,17 @@ snapshots:
clean-stack: 2.2.0
indent-string: 4.0.0
- ajv-formats@2.1.1(ajv@8.16.0):
+ ajv-formats@2.1.1(ajv@8.17.1):
optionalDependencies:
- ajv: 8.16.0
+ ajv: 8.17.1
ajv-keywords@3.5.2(ajv@6.12.6):
dependencies:
ajv: 6.12.6
- ajv-keywords@5.1.0(ajv@8.16.0):
+ ajv-keywords@5.1.0(ajv@8.17.1):
dependencies:
- ajv: 8.16.0
+ ajv: 8.17.1
fast-deep-equal: 3.1.3
ajv@6.12.6:
@@ -8115,14 +7996,14 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
- ajv@8.16.0:
+ ajv@8.17.1:
dependencies:
fast-deep-equal: 3.1.3
+ fast-uri: 3.0.3
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
- uri-js: 4.4.1
- algoliasearch-helper@3.22.2(algoliasearch@4.24.0):
+ algoliasearch-helper@3.22.5(algoliasearch@4.24.0):
dependencies:
'@algolia/events': 4.0.1
algoliasearch: 4.24.0
@@ -8153,11 +8034,7 @@ snapshots:
ansi-regex@5.0.1: {}
- ansi-regex@6.0.1: {}
-
- ansi-styles@3.2.1:
- dependencies:
- color-convert: 1.9.3
+ ansi-regex@6.1.0: {}
ansi-styles@4.3.0:
dependencies:
@@ -8214,66 +8091,66 @@ snapshots:
is-array-buffer: 3.0.4
is-shared-array-buffer: 1.0.3
- astring@1.8.6: {}
+ astring@1.9.0: {}
asynckit@0.4.0: {}
at-least-node@1.0.0: {}
- autoprefixer@10.4.19(postcss@8.4.39):
+ autoprefixer@10.4.20(postcss@8.4.47):
dependencies:
- browserslist: 4.23.1
- caniuse-lite: 1.0.30001640
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001671
fraction.js: 4.3.7
normalize-range: 0.1.2
- picocolors: 1.0.1
- postcss: 8.4.39
+ picocolors: 1.1.1
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
available-typed-arrays@1.0.7:
dependencies:
possible-typed-array-names: 1.0.0
- axios@1.7.2:
+ axios@1.7.7:
dependencies:
- follow-redirects: 1.15.6(debug@4.3.5)
+ follow-redirects: 1.15.9(debug@4.3.7)
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
- babel-loader@9.1.3(@babel/core@7.24.7)(webpack@5.92.1):
+ babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.95.0):
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.26.0
find-cache-dir: 4.0.0
schema-utils: 4.2.0
- webpack: 5.92.1
+ webpack: 5.95.0
babel-plugin-dynamic-import-node@2.3.3:
dependencies:
object.assign: 4.1.5
- babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.7):
+ babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.26.0):
dependencies:
- '@babel/compat-data': 7.24.7
- '@babel/core': 7.24.7
- '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7)
+ '@babel/compat-data': 7.26.0
+ '@babel/core': 7.26.0
+ '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0)
semver: 6.3.1
transitivePeerDependencies:
- supports-color
- babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.7):
+ babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0):
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7)
- core-js-compat: 3.37.1
+ '@babel/core': 7.26.0
+ '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0)
+ core-js-compat: 3.38.1
transitivePeerDependencies:
- supports-color
- babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.7):
+ babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.26.0):
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7)
+ '@babel/core': 7.26.0
+ '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0)
transitivePeerDependencies:
- supports-color
@@ -8287,7 +8164,7 @@ snapshots:
binary-extensions@2.3.0: {}
- body-parser@1.20.2:
+ body-parser@1.20.3:
dependencies:
bytes: 3.1.2
content-type: 1.0.5
@@ -8297,7 +8174,7 @@ snapshots:
http-errors: 2.0.0
iconv-lite: 0.4.24
on-finished: 2.4.1
- qs: 6.11.0
+ qs: 6.13.0
raw-body: 2.5.2
type-is: 1.6.18
unpipe: 1.0.0
@@ -8346,12 +8223,12 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browserslist@4.23.1:
+ browserslist@4.24.2:
dependencies:
- caniuse-lite: 1.0.30001640
- electron-to-chromium: 1.4.817
- node-releases: 2.0.14
- update-browserslist-db: 1.1.0(browserslist@4.23.1)
+ caniuse-lite: 1.0.30001671
+ electron-to-chromium: 1.5.47
+ node-releases: 2.0.18
+ update-browserslist-db: 1.1.1(browserslist@4.24.2)
buffer-from@1.1.2: {}
@@ -8386,7 +8263,7 @@ snapshots:
camel-case@4.1.2:
dependencies:
pascal-case: 3.1.2
- tslib: 2.6.3
+ tslib: 2.8.0
camelcase@6.3.0: {}
@@ -8396,21 +8273,15 @@ snapshots:
caniuse-api@3.0.0:
dependencies:
- browserslist: 4.23.1
- caniuse-lite: 1.0.30001640
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001671
lodash.memoize: 4.1.2
lodash.uniq: 4.5.0
- caniuse-lite@1.0.30001640: {}
+ caniuse-lite@1.0.30001671: {}
ccount@2.0.1: {}
- chalk@2.4.2:
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
-
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
@@ -8437,6 +8308,20 @@ snapshots:
domhandler: 5.0.3
domutils: 3.1.0
+ cheerio@1.0.0:
+ dependencies:
+ cheerio-select: 2.1.0
+ dom-serializer: 2.0.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ encoding-sniffer: 0.2.0
+ htmlparser2: 9.1.0
+ parse5: 7.2.0
+ parse5-htmlparser2-tree-adapter: 7.1.0
+ parse5-parser-stream: 7.1.2
+ undici: 6.20.1
+ whatwg-mimetype: 4.0.0
+
cheerio@1.0.0-rc.12:
dependencies:
cheerio-select: 2.1.0
@@ -8444,8 +8329,8 @@ snapshots:
domhandler: 5.0.3
domutils: 3.1.0
htmlparser2: 8.0.2
- parse5: 7.1.2
- parse5-htmlparser2-tree-adapter: 7.0.0
+ parse5: 7.2.0
+ parse5-htmlparser2-tree-adapter: 7.1.0
chokidar@3.6.0:
dependencies:
@@ -8497,16 +8382,10 @@ snapshots:
collapse-white-space@2.1.0: {}
- color-convert@1.9.3:
- dependencies:
- color-name: 1.1.3
-
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
- color-name@1.1.3: {}
-
color-name@1.1.4: {}
colord@2.9.3: {}
@@ -8537,7 +8416,7 @@ snapshots:
compressible@2.0.18:
dependencies:
- mime-db: 1.52.0
+ mime-db: 1.53.0
compression@1.7.4:
dependencies:
@@ -8553,14 +8432,12 @@ snapshots:
concat-map@0.0.1: {}
- concurrently@8.2.2:
+ concurrently@9.0.1:
dependencies:
chalk: 4.1.2
- date-fns: 2.30.0
lodash: 4.17.21
rxjs: 7.8.1
shell-quote: 1.8.1
- spawn-command: 0.0.2
supports-color: 8.1.1
tree-kill: 1.2.2
yargs: 17.7.2
@@ -8594,11 +8471,11 @@ snapshots:
cookie-signature@1.0.6: {}
- cookie@0.6.0: {}
+ cookie@1.0.1: {}
copy-text-to-clipboard@3.2.0: {}
- copy-webpack-plugin@11.0.0(webpack@5.92.1):
+ copy-webpack-plugin@11.0.0(webpack@5.95.0):
dependencies:
fast-glob: 3.3.2
glob-parent: 6.0.2
@@ -8606,15 +8483,15 @@ snapshots:
normalize-path: 3.0.0
schema-utils: 4.2.0
serialize-javascript: 6.0.2
- webpack: 5.92.1
+ webpack: 5.95.0
- core-js-compat@3.37.1:
+ core-js-compat@3.38.1:
dependencies:
- browserslist: 4.23.1
+ browserslist: 4.24.2
- core-js-pure@3.37.1: {}
+ core-js-pure@3.38.1: {}
- core-js@3.37.1: {}
+ core-js@3.38.1: {}
core-util-is@1.0.3: {}
@@ -8626,14 +8503,14 @@ snapshots:
path-type: 4.0.0
yaml: 1.10.2
- cosmiconfig@8.3.6(typescript@5.5.3):
+ cosmiconfig@8.3.6(typescript@5.6.3):
dependencies:
import-fresh: 3.3.0
js-yaml: 4.1.0
parse-json: 5.2.0
path-type: 4.0.0
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
cross-spawn@7.0.3:
dependencies:
@@ -8647,32 +8524,32 @@ snapshots:
css-color-keywords@1.0.0: {}
- css-declaration-sorter@7.2.0(postcss@8.4.39):
+ css-declaration-sorter@7.2.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- css-loader@6.11.0(webpack@5.92.1):
+ css-loader@6.11.0(webpack@5.95.0):
dependencies:
- icss-utils: 5.1.0(postcss@8.4.39)
- postcss: 8.4.39
- postcss-modules-extract-imports: 3.1.0(postcss@8.4.39)
- postcss-modules-local-by-default: 4.0.5(postcss@8.4.39)
- postcss-modules-scope: 3.2.0(postcss@8.4.39)
- postcss-modules-values: 4.0.0(postcss@8.4.39)
+ icss-utils: 5.1.0(postcss@8.4.47)
+ postcss: 8.4.47
+ postcss-modules-extract-imports: 3.1.0(postcss@8.4.47)
+ postcss-modules-local-by-default: 4.0.5(postcss@8.4.47)
+ postcss-modules-scope: 3.2.0(postcss@8.4.47)
+ postcss-modules-values: 4.0.0(postcss@8.4.47)
postcss-value-parser: 4.2.0
- semver: 7.6.2
+ semver: 7.6.3
optionalDependencies:
- webpack: 5.92.1
+ webpack: 5.95.0
- css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.92.1):
+ css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.95.0):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
- cssnano: 6.1.2(postcss@8.4.39)
+ cssnano: 6.1.2(postcss@8.4.47)
jest-worker: 29.7.0
- postcss: 8.4.39
+ postcss: 8.4.47
schema-utils: 4.2.0
serialize-javascript: 6.0.2
- webpack: 5.92.1
+ webpack: 5.95.0
optionalDependencies:
clean-css: 5.3.3
@@ -8701,79 +8578,79 @@ snapshots:
css-tree@2.2.1:
dependencies:
mdn-data: 2.0.28
- source-map-js: 1.2.0
+ source-map-js: 1.2.1
css-tree@2.3.1:
dependencies:
mdn-data: 2.0.30
- source-map-js: 1.2.0
+ source-map-js: 1.2.1
css-what@6.1.0: {}
cssesc@3.0.0: {}
- cssnano-preset-advanced@6.1.2(postcss@8.4.39):
+ cssnano-preset-advanced@6.1.2(postcss@8.4.47):
dependencies:
- autoprefixer: 10.4.19(postcss@8.4.39)
- browserslist: 4.23.1
- cssnano-preset-default: 6.1.2(postcss@8.4.39)
- postcss: 8.4.39
- postcss-discard-unused: 6.0.5(postcss@8.4.39)
- postcss-merge-idents: 6.0.3(postcss@8.4.39)
- postcss-reduce-idents: 6.0.3(postcss@8.4.39)
- postcss-zindex: 6.0.2(postcss@8.4.39)
+ autoprefixer: 10.4.20(postcss@8.4.47)
+ browserslist: 4.24.2
+ cssnano-preset-default: 6.1.2(postcss@8.4.47)
+ postcss: 8.4.47
+ postcss-discard-unused: 6.0.5(postcss@8.4.47)
+ postcss-merge-idents: 6.0.3(postcss@8.4.47)
+ postcss-reduce-idents: 6.0.3(postcss@8.4.47)
+ postcss-zindex: 6.0.2(postcss@8.4.47)
- cssnano-preset-default@6.1.2(postcss@8.4.39):
+ cssnano-preset-default@6.1.2(postcss@8.4.47):
dependencies:
- browserslist: 4.23.1
- css-declaration-sorter: 7.2.0(postcss@8.4.39)
- cssnano-utils: 4.0.2(postcss@8.4.39)
- postcss: 8.4.39
- postcss-calc: 9.0.1(postcss@8.4.39)
- postcss-colormin: 6.1.0(postcss@8.4.39)
- postcss-convert-values: 6.1.0(postcss@8.4.39)
- postcss-discard-comments: 6.0.2(postcss@8.4.39)
- postcss-discard-duplicates: 6.0.3(postcss@8.4.39)
- postcss-discard-empty: 6.0.3(postcss@8.4.39)
- postcss-discard-overridden: 6.0.2(postcss@8.4.39)
- postcss-merge-longhand: 6.0.5(postcss@8.4.39)
- postcss-merge-rules: 6.1.1(postcss@8.4.39)
- postcss-minify-font-values: 6.1.0(postcss@8.4.39)
- postcss-minify-gradients: 6.0.3(postcss@8.4.39)
- postcss-minify-params: 6.1.0(postcss@8.4.39)
- postcss-minify-selectors: 6.0.4(postcss@8.4.39)
- postcss-normalize-charset: 6.0.2(postcss@8.4.39)
- postcss-normalize-display-values: 6.0.2(postcss@8.4.39)
- postcss-normalize-positions: 6.0.2(postcss@8.4.39)
- postcss-normalize-repeat-style: 6.0.2(postcss@8.4.39)
- postcss-normalize-string: 6.0.2(postcss@8.4.39)
- postcss-normalize-timing-functions: 6.0.2(postcss@8.4.39)
- postcss-normalize-unicode: 6.1.0(postcss@8.4.39)
- postcss-normalize-url: 6.0.2(postcss@8.4.39)
- postcss-normalize-whitespace: 6.0.2(postcss@8.4.39)
- postcss-ordered-values: 6.0.2(postcss@8.4.39)
- postcss-reduce-initial: 6.1.0(postcss@8.4.39)
- postcss-reduce-transforms: 6.0.2(postcss@8.4.39)
- postcss-svgo: 6.0.3(postcss@8.4.39)
- postcss-unique-selectors: 6.0.4(postcss@8.4.39)
+ browserslist: 4.24.2
+ css-declaration-sorter: 7.2.0(postcss@8.4.47)
+ cssnano-utils: 4.0.2(postcss@8.4.47)
+ postcss: 8.4.47
+ postcss-calc: 9.0.1(postcss@8.4.47)
+ postcss-colormin: 6.1.0(postcss@8.4.47)
+ postcss-convert-values: 6.1.0(postcss@8.4.47)
+ postcss-discard-comments: 6.0.2(postcss@8.4.47)
+ postcss-discard-duplicates: 6.0.3(postcss@8.4.47)
+ postcss-discard-empty: 6.0.3(postcss@8.4.47)
+ postcss-discard-overridden: 6.0.2(postcss@8.4.47)
+ postcss-merge-longhand: 6.0.5(postcss@8.4.47)
+ postcss-merge-rules: 6.1.1(postcss@8.4.47)
+ postcss-minify-font-values: 6.1.0(postcss@8.4.47)
+ postcss-minify-gradients: 6.0.3(postcss@8.4.47)
+ postcss-minify-params: 6.1.0(postcss@8.4.47)
+ postcss-minify-selectors: 6.0.4(postcss@8.4.47)
+ postcss-normalize-charset: 6.0.2(postcss@8.4.47)
+ postcss-normalize-display-values: 6.0.2(postcss@8.4.47)
+ postcss-normalize-positions: 6.0.2(postcss@8.4.47)
+ postcss-normalize-repeat-style: 6.0.2(postcss@8.4.47)
+ postcss-normalize-string: 6.0.2(postcss@8.4.47)
+ postcss-normalize-timing-functions: 6.0.2(postcss@8.4.47)
+ postcss-normalize-unicode: 6.1.0(postcss@8.4.47)
+ postcss-normalize-url: 6.0.2(postcss@8.4.47)
+ postcss-normalize-whitespace: 6.0.2(postcss@8.4.47)
+ postcss-ordered-values: 6.0.2(postcss@8.4.47)
+ postcss-reduce-initial: 6.1.0(postcss@8.4.47)
+ postcss-reduce-transforms: 6.0.2(postcss@8.4.47)
+ postcss-svgo: 6.0.3(postcss@8.4.47)
+ postcss-unique-selectors: 6.0.4(postcss@8.4.47)
- cssnano-utils@4.0.2(postcss@8.4.39):
+ cssnano-utils@4.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- cssnano@6.1.2(postcss@8.4.39):
+ cssnano@6.1.2(postcss@8.4.47):
dependencies:
- cssnano-preset-default: 6.1.2(postcss@8.4.39)
+ cssnano-preset-default: 6.1.2(postcss@8.4.47)
lilconfig: 3.1.2
- postcss: 8.4.39
+ postcss: 8.4.47
csso@5.0.5:
dependencies:
css-tree: 2.2.1
- cssstyle@4.0.1:
+ cssstyle@4.1.0:
dependencies:
- rrweb-cssom: 0.6.0
+ rrweb-cssom: 0.7.1
csstype@3.1.3: {}
@@ -8800,19 +8677,15 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.1
- date-fns@2.30.0:
- dependencies:
- '@babel/runtime': 7.24.7
-
debounce@1.2.1: {}
debug@2.6.9:
dependencies:
ms: 2.0.0
- debug@4.3.5:
+ debug@4.3.7:
dependencies:
- ms: 2.1.2
+ ms: 2.1.3
decimal.js@10.4.3: {}
@@ -8883,7 +8756,7 @@ snapshots:
detect-port@1.6.1:
dependencies:
address: 1.2.2
- debug: 4.3.5
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
@@ -8901,11 +8774,11 @@ snapshots:
dependencies:
'@leichtgewicht/ip-codec': 2.0.5
- docusaurus-plugin-redoc@2.1.1(@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3))(core-js@3.37.1)(enzyme@3.11.0)(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
+ docusaurus-plugin-redoc@2.1.1(@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3))(core-js@3.38.1)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
dependencies:
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
'@redocly/openapi-core': 1.16.0
- redoc: 2.1.5(core-js@3.37.1)(enzyme@3.11.0)(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ redoc: 2.1.5(core-js@3.38.1)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
transitivePeerDependencies:
- core-js
- encoding
@@ -8917,16 +8790,18 @@ snapshots:
- styled-components
- supports-color
- docusaurus-theme-redoc@2.1.1(@docusaurus/theme-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(core-js@3.37.1)(enzyme@3.11.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(webpack@5.92.1):
+ docusaurus-theme-redoc@2.1.2(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(core-js@3.38.1)(enzyme@3.11.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(webpack@5.95.0):
dependencies:
- '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@redocly/openapi-core': 1.16.0
clsx: 1.2.1
lodash: 4.17.21
- mobx: 6.13.0
- redoc: 2.1.5(core-js@3.37.1)(enzyme@3.11.0)(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- styled-components: 6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- webpack: 5.92.1
+ mobx: 6.13.5
+ postcss: 8.4.47
+ postcss-prefix-selector: 1.16.1(postcss@8.4.47)
+ redoc: 2.1.5(core-js@3.38.1)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ webpack: 5.95.0
transitivePeerDependencies:
- core-js
- encoding
@@ -8962,7 +8837,7 @@ snapshots:
dependencies:
domelementtype: 2.3.0
- dompurify@3.1.6: {}
+ dompurify@3.1.7: {}
domutils@2.8.0:
dependencies:
@@ -8979,7 +8854,7 @@ snapshots:
dot-case@3.0.4:
dependencies:
no-case: 3.0.4
- tslib: 2.6.3
+ tslib: 2.8.0
dot-prop@6.0.1:
dependencies:
@@ -8991,7 +8866,7 @@ snapshots:
ee-first@1.1.1: {}
- electron-to-chromium@1.4.817: {}
+ electron-to-chromium@1.5.47: {}
emoji-regex@8.0.0: {}
@@ -9001,11 +8876,18 @@ snapshots:
emojis-list@3.0.0: {}
- emoticon@4.0.1: {}
+ emoticon@4.1.0: {}
encodeurl@1.0.2: {}
- enhanced-resolve@5.17.0:
+ encodeurl@2.0.0: {}
+
+ encoding-sniffer@0.2.0:
+ dependencies:
+ iconv-lite: 0.6.3
+ whatwg-encoding: 3.1.1
+
+ enhanced-resolve@5.17.1:
dependencies:
graceful-fs: 4.2.11
tapable: 2.2.1
@@ -9022,7 +8904,7 @@ snapshots:
enzyme@3.11.0:
dependencies:
array.prototype.flat: 1.3.2
- cheerio: 1.0.0-rc.12
+ cheerio: 1.0.0
enzyme-shallow-equal: 1.0.7
function.prototype.name: 1.1.6
has: 1.0.4
@@ -9084,7 +8966,7 @@ snapshots:
object-inspect: 1.13.2
object-keys: 1.1.1
object.assign: 4.1.5
- regexp.prototype.flags: 1.5.2
+ regexp.prototype.flags: 1.5.3
safe-array-concat: 1.1.2
safe-regex-test: 1.0.3
string.prototype.trim: 1.2.9
@@ -9129,12 +9011,26 @@ snapshots:
es6-promise@3.3.1: {}
- esbuild-loader@4.2.0(webpack@5.92.1):
+ esast-util-from-estree@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ unist-util-position-from-estree: 2.0.0
+
+ esast-util-from-js@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ acorn: 8.13.0
+ esast-util-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ esbuild-loader@4.2.2(webpack@5.95.0):
dependencies:
esbuild: 0.21.5
- get-tsconfig: 4.7.5
+ get-tsconfig: 4.8.1
loader-utils: 2.0.4
- webpack: 5.92.1
+ webpack: 5.95.0
webpack-sources: 1.4.3
esbuild@0.21.5:
@@ -9163,14 +9059,12 @@ snapshots:
'@esbuild/win32-ia32': 0.21.5
'@esbuild/win32-x64': 0.21.5
- escalade@3.1.2: {}
+ escalade@3.2.0: {}
escape-goat@4.0.0: {}
escape-html@1.0.3: {}
- escape-string-regexp@1.0.5: {}
-
escape-string-regexp@4.0.0: {}
escape-string-regexp@5.0.0: {}
@@ -9192,7 +9086,7 @@ snapshots:
estree-util-attach-comments@3.0.0:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-util-build-jsx@3.0.1:
dependencies:
@@ -9203,24 +9097,29 @@ snapshots:
estree-util-is-identifier-name@3.0.0: {}
+ estree-util-scope@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+
estree-util-to-js@2.0.0:
dependencies:
'@types/estree-jsx': 1.0.5
- astring: 1.8.6
+ astring: 1.9.0
source-map: 0.7.4
estree-util-value-to-estree@3.1.2:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-util-visit@2.0.0:
dependencies:
'@types/estree-jsx': 1.0.5
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
estree-walker@3.0.3:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
esutils@2.0.3: {}
@@ -9230,7 +9129,7 @@ snapshots:
eval@0.1.8:
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
require-like: 0.1.2
eventemitter3@4.0.7: {}
@@ -9251,34 +9150,34 @@ snapshots:
signal-exit: 3.0.7
strip-final-newline: 2.0.0
- express@4.19.2:
+ express@4.21.1:
dependencies:
accepts: 1.3.8
array-flatten: 1.1.1
- body-parser: 1.20.2
+ body-parser: 1.20.3
content-disposition: 0.5.4
content-type: 1.0.5
- cookie: 0.6.0
+ cookie: 1.0.1
cookie-signature: 1.0.6
debug: 2.6.9
depd: 2.0.0
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
- finalhandler: 1.2.0
+ finalhandler: 1.3.1
fresh: 0.5.2
http-errors: 2.0.0
- merge-descriptors: 1.0.1
+ merge-descriptors: 1.0.3
methods: 1.1.2
on-finished: 2.4.1
parseurl: 1.3.3
- path-to-regexp: 0.1.7
+ path-to-regexp: 3.3.0
proxy-addr: 2.0.7
- qs: 6.11.0
+ qs: 6.13.0
range-parser: 1.2.1
safe-buffer: 5.2.1
- send: 0.18.0
- serve-static: 1.15.0
+ send: 0.19.0
+ serve-static: 1.16.2
setprototypeof: 1.2.0
statuses: 2.0.1
type-is: 1.6.18
@@ -9301,15 +9200,13 @@ snapshots:
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
- micromatch: 4.0.7
+ micromatch: 4.0.8
fast-json-stable-stringify@2.1.0: {}
fast-safe-stringify@2.1.1: {}
- fast-url-parser@1.1.3:
- dependencies:
- punycode: 1.4.1
+ fast-uri@3.0.3: {}
fastq@1.17.1:
dependencies:
@@ -9327,11 +9224,11 @@ snapshots:
dependencies:
xml-js: 1.6.11
- file-loader@6.2.0(webpack@5.92.1):
+ file-loader@6.2.0(webpack@5.95.0):
dependencies:
loader-utils: 2.0.4
schema-utils: 3.3.0
- webpack: 5.92.1
+ webpack: 5.95.0
filesize@8.0.7: {}
@@ -9339,10 +9236,10 @@ snapshots:
dependencies:
to-regex-range: 5.0.1
- finalhandler@1.2.0:
+ finalhandler@1.3.1:
dependencies:
debug: 2.6.9
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
on-finished: 2.4.1
parseurl: 1.3.3
@@ -9372,9 +9269,9 @@ snapshots:
flat@5.0.2: {}
- follow-redirects@1.15.6(debug@4.3.5):
+ follow-redirects@1.15.9(debug@4.3.7):
optionalDependencies:
- debug: 4.3.5
+ debug: 4.3.7
for-each@0.3.3:
dependencies:
@@ -9382,9 +9279,9 @@ snapshots:
foreach@2.0.6: {}
- fork-ts-checker-webpack-plugin@6.5.3(typescript@5.5.3)(webpack@5.92.1):
+ fork-ts-checker-webpack-plugin@6.5.3(typescript@5.6.3)(webpack@5.95.0):
dependencies:
- '@babel/code-frame': 7.24.7
+ '@babel/code-frame': 7.26.0
'@types/json-schema': 7.0.15
chalk: 4.1.2
chokidar: 3.6.0
@@ -9395,10 +9292,10 @@ snapshots:
memfs: 3.5.3
minimatch: 3.1.2
schema-utils: 2.7.0
- semver: 7.6.2
+ semver: 7.6.3
tapable: 1.1.3
- typescript: 5.5.3
- webpack: 5.92.1
+ typescript: 5.6.3
+ webpack: 5.95.0
form-data-encoder@4.0.2: {}
@@ -9471,8 +9368,6 @@ snapshots:
get-stream@6.0.1: {}
- get-stream@8.0.1: {}
-
get-stream@9.0.1:
dependencies:
'@sec-ant/readable-stream': 0.4.1
@@ -9484,7 +9379,7 @@ snapshots:
es-errors: 1.3.0
get-intrinsic: 1.2.4
- get-tsconfig@4.7.5:
+ get-tsconfig@4.8.1:
dependencies:
resolve-pkg-maps: 1.0.0
@@ -9535,7 +9430,7 @@ snapshots:
array-union: 2.1.0
dir-glob: 3.0.1
fast-glob: 3.3.2
- ignore: 5.3.1
+ ignore: 5.3.2
merge2: 1.4.1
slash: 3.0.0
@@ -9543,7 +9438,7 @@ snapshots:
dependencies:
dir-glob: 3.0.1
fast-glob: 3.3.2
- ignore: 5.3.1
+ ignore: 5.3.2
merge2: 1.4.1
slash: 4.0.0
@@ -9551,20 +9446,19 @@ snapshots:
dependencies:
get-intrinsic: 1.2.4
- got@14.4.1:
+ got@14.4.3:
dependencies:
- '@sindresorhus/is': 6.3.1
+ '@sindresorhus/is': 7.0.1
'@szmarczak/http-timer': 5.0.1
cacheable-lookup: 7.0.0
cacheable-request: 12.0.1
decompress-response: 6.0.0
form-data-encoder: 4.0.2
- get-stream: 8.0.1
http2-wrapper: 2.2.1
lowercase-keys: 3.0.0
p-cancelable: 4.0.1
responselike: 3.0.0
- type-fest: 4.21.0
+ type-fest: 4.26.1
graceful-fs@4.2.10: {}
@@ -9585,8 +9479,6 @@ snapshots:
has-bigints@1.0.2: {}
- has-flag@3.0.0: {}
-
has-flag@4.0.0: {}
has-property-descriptors@1.0.2:
@@ -9612,12 +9504,12 @@ snapshots:
hast-util-from-parse5@8.0.1:
dependencies:
'@types/hast': 3.0.4
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
devlop: 1.1.0
hastscript: 8.0.0
property-information: 6.5.0
- vfile: 6.0.1
- vfile-location: 5.0.2
+ vfile: 6.0.3
+ vfile-location: 5.0.3
web-namespaces: 2.0.1
hast-util-parse-selector@4.0.0:
@@ -9627,22 +9519,22 @@ snapshots:
hast-util-raw@9.0.4:
dependencies:
'@types/hast': 3.0.4
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
'@ungap/structured-clone': 1.2.0
hast-util-from-parse5: 8.0.1
hast-util-to-parse5: 8.0.0
html-void-elements: 3.0.0
mdast-util-to-hast: 13.2.0
- parse5: 7.1.2
+ parse5: 7.2.0
unist-util-position: 5.0.0
unist-util-visit: 5.0.0
- vfile: 6.0.1
+ vfile: 6.0.3
web-namespaces: 2.0.1
zwitch: 2.0.4
hast-util-to-estree@3.1.0:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
'@types/estree-jsx': 1.0.5
'@types/hast': 3.0.4
comma-separated-tokens: 2.0.3
@@ -9650,8 +9542,8 @@ snapshots:
estree-util-attach-comments: 3.0.0
estree-util-is-identifier-name: 3.0.0
hast-util-whitespace: 3.0.0
- mdast-util-mdx-expression: 2.0.0
- mdast-util-mdx-jsx: 3.1.2
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
mdast-util-mdxjs-esm: 2.0.1
property-information: 6.5.0
space-separated-tokens: 2.0.2
@@ -9663,19 +9555,39 @@ snapshots:
hast-util-to-jsx-runtime@2.3.0:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
'@types/hast': 3.0.4
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
comma-separated-tokens: 2.0.3
devlop: 1.1.0
estree-util-is-identifier-name: 3.0.0
hast-util-whitespace: 3.0.0
- mdast-util-mdx-expression: 2.0.0
- mdast-util-mdx-jsx: 3.1.2
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
mdast-util-mdxjs-esm: 2.0.1
property-information: 6.5.0
space-separated-tokens: 2.0.2
- style-to-object: 1.0.6
+ style-to-object: 1.0.8
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-jsx-runtime@2.3.2:
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 1.0.8
unist-util-position: 5.0.0
vfile-message: 4.0.2
transitivePeerDependencies:
@@ -9707,7 +9619,7 @@ snapshots:
history@4.10.1:
dependencies:
- '@babel/runtime': 7.24.7
+ '@babel/runtime': 7.26.0
loose-envify: 1.4.0
resolve-pathname: 3.0.0
tiny-invariant: 1.3.3
@@ -9746,7 +9658,7 @@ snapshots:
he: 1.2.0
param-case: 3.0.4
relateurl: 0.2.7
- terser: 5.31.1
+ terser: 5.36.0
html-minifier-terser@7.2.0:
dependencies:
@@ -9756,13 +9668,13 @@ snapshots:
entities: 4.5.0
param-case: 3.0.4
relateurl: 0.2.7
- terser: 5.31.1
+ terser: 5.36.0
html-tags@3.3.1: {}
html-void-elements@3.0.0: {}
- html-webpack-plugin@5.6.0(webpack@5.92.1):
+ html-webpack-plugin@5.6.3(webpack@5.95.0):
dependencies:
'@types/html-minifier-terser': 6.1.0
html-minifier-terser: 6.1.0
@@ -9770,7 +9682,7 @@ snapshots:
pretty-error: 4.0.0
tapable: 2.2.1
optionalDependencies:
- webpack: 5.92.1
+ webpack: 5.95.0
htmlparser2@6.1.0:
dependencies:
@@ -9786,6 +9698,13 @@ snapshots:
domutils: 3.1.0
entities: 4.5.0
+ htmlparser2@9.1.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ entities: 4.5.0
+
http-cache-semantics@4.1.1: {}
http-deceiver@1.2.7: {}
@@ -9810,26 +9729,26 @@ snapshots:
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.1
- debug: 4.3.5
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
- http-proxy-middleware@2.0.6(@types/express@4.17.21)(debug@4.3.5):
+ http-proxy-middleware@2.0.7(@types/express@4.17.21)(debug@4.3.7):
dependencies:
- '@types/http-proxy': 1.17.14
- http-proxy: 1.18.1(debug@4.3.5)
+ '@types/http-proxy': 1.17.15
+ http-proxy: 1.18.1(debug@4.3.7)
is-glob: 4.0.3
is-plain-obj: 3.0.0
- micromatch: 4.0.7
+ micromatch: 4.0.8
optionalDependencies:
'@types/express': 4.17.21
transitivePeerDependencies:
- debug
- http-proxy@1.18.1(debug@4.3.5):
+ http-proxy@1.18.1(debug@4.3.7):
dependencies:
eventemitter3: 4.0.7
- follow-redirects: 1.15.6(debug@4.3.5)
+ follow-redirects: 1.15.9(debug@4.3.7)
requires-port: 1.0.0
transitivePeerDependencies:
- debug
@@ -9844,7 +9763,7 @@ snapshots:
https-proxy-agent@7.0.5:
dependencies:
agent-base: 7.1.1
- debug: 4.3.5
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
@@ -9858,11 +9777,11 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
- icss-utils@5.1.0(postcss@8.4.39):
+ icss-utils@5.1.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- ignore@5.3.1: {}
+ ignore@5.3.2: {}
image-size@1.1.1:
dependencies:
@@ -9883,7 +9802,7 @@ snapshots:
indent-string@4.0.0: {}
- infima@0.2.0-alpha.43: {}
+ infima@0.2.0-alpha.44: {}
inflight@1.0.6:
dependencies:
@@ -9900,7 +9819,7 @@ snapshots:
inline-style-parser@0.1.1: {}
- inline-style-parser@0.2.3: {}
+ inline-style-parser@0.2.4: {}
internal-slot@1.0.7:
dependencies:
@@ -9951,7 +9870,7 @@ snapshots:
dependencies:
ci-info: 3.9.0
- is-core-module@2.14.0:
+ is-core-module@2.15.1:
dependencies:
hasown: 2.0.2
@@ -10014,7 +9933,7 @@ snapshots:
is-reference@3.0.2:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
is-regex@1.1.4:
dependencies:
@@ -10059,8 +9978,6 @@ snapshots:
is-yarn-global@0.4.1: {}
- isarray@0.0.1: {}
-
isarray@1.0.0: {}
isarray@2.0.5: {}
@@ -10069,11 +9986,11 @@ snapshots:
isobject@3.0.1: {}
- isomorphic-dompurify@2.12.0:
+ isomorphic-dompurify@2.16.0:
dependencies:
'@types/dompurify': 3.0.5
- dompurify: 3.1.6
- jsdom: 24.1.0
+ dompurify: 3.1.7
+ jsdom: 25.0.1
transitivePeerDependencies:
- bufferutil
- canvas
@@ -10083,7 +10000,7 @@ snapshots:
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
chalk: 4.1.2
ci-info: 3.9.0
graceful-fs: 4.2.11
@@ -10091,13 +10008,13 @@ snapshots:
jest-worker@27.5.1:
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
merge-stream: 2.0.0
supports-color: 8.1.1
jest-worker@29.7.0:
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 20.17.2
jest-util: 29.7.0
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -10125,9 +10042,9 @@ snapshots:
dependencies:
argparse: 2.0.1
- jsdom@24.1.0:
+ jsdom@25.0.1:
dependencies:
- cssstyle: 4.0.1
+ cssstyle: 4.1.0
data-urls: 5.0.0
decimal.js: 10.4.3
form-data: 4.0.0
@@ -10135,12 +10052,12 @@ snapshots:
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.5
is-potential-custom-element-name: 1.0.1
- nwsapi: 2.2.10
+ nwsapi: 2.2.13
parse5: 7.1.2
rrweb-cssom: 0.7.1
saxes: 6.0.0
symbol-tree: 3.2.4
- tough-cookie: 4.1.4
+ tough-cookie: 5.0.0
w3c-xmlserializer: 5.0.0
webidl-conversions: 7.0.0
whatwg-encoding: 3.1.1
@@ -10153,9 +10070,7 @@ snapshots:
- supports-color
- utf-8-validate
- jsesc@0.5.0: {}
-
- jsesc@2.5.2: {}
+ jsesc@3.0.2: {}
json-buffer@3.0.1: {}
@@ -10193,9 +10108,9 @@ snapshots:
dependencies:
package-json: 8.1.1
- launch-editor@2.8.0:
+ launch-editor@2.9.1:
dependencies:
- picocolors: 1.0.1
+ picocolors: 1.1.1
shell-quote: 1.8.1
leven@3.1.0: {}
@@ -10249,7 +10164,7 @@ snapshots:
lower-case@2.0.2:
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.0
lowercase-keys@3.0.0: {}
@@ -10265,18 +10180,18 @@ snapshots:
markdown-extensions@2.0.0: {}
- markdown-table@3.0.3: {}
+ markdown-table@3.0.4: {}
- marked@13.0.2: {}
+ marked@14.1.3: {}
marked@4.3.0: {}
mdast-util-directive@3.0.0:
dependencies:
'@types/mdast': 4.0.4
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.1
+ mdast-util-from-markdown: 2.0.2
mdast-util-to-markdown: 2.1.0
parse-entities: 4.0.1
stringify-entities: 4.0.4
@@ -10294,7 +10209,24 @@ snapshots:
mdast-util-from-markdown@2.0.1:
dependencies:
'@types/mdast': 4.0.4
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-decode-string: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-from-markdown@2.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
decode-named-character-reference: 1.0.2
devlop: 1.1.0
mdast-util-to-string: 4.0.0
@@ -10313,13 +10245,13 @@ snapshots:
'@types/mdast': 4.0.4
devlop: 1.1.0
escape-string-regexp: 5.0.0
- mdast-util-from-markdown: 2.0.1
+ mdast-util-from-markdown: 2.0.2
mdast-util-to-markdown: 2.1.0
micromark-extension-frontmatter: 2.0.0
transitivePeerDependencies:
- supports-color
- mdast-util-gfm-autolink-literal@2.0.0:
+ mdast-util-gfm-autolink-literal@2.0.1:
dependencies:
'@types/mdast': 4.0.4
ccount: 2.0.1
@@ -10331,7 +10263,7 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.1
+ mdast-util-from-markdown: 2.0.2
mdast-util-to-markdown: 2.1.0
micromark-util-normalize-identifier: 2.0.0
transitivePeerDependencies:
@@ -10340,7 +10272,7 @@ snapshots:
mdast-util-gfm-strikethrough@2.0.0:
dependencies:
'@types/mdast': 4.0.4
- mdast-util-from-markdown: 2.0.1
+ mdast-util-from-markdown: 2.0.2
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
@@ -10349,8 +10281,8 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
devlop: 1.1.0
- markdown-table: 3.0.3
- mdast-util-from-markdown: 2.0.1
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.2
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
@@ -10359,15 +10291,15 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.1
+ mdast-util-from-markdown: 2.0.2
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
- supports-color
mdast-util-gfm@3.0.0:
dependencies:
- mdast-util-from-markdown: 2.0.1
- mdast-util-gfm-autolink-literal: 2.0.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm-autolink-literal: 2.0.1
mdast-util-gfm-footnote: 2.0.0
mdast-util-gfm-strikethrough: 2.0.0
mdast-util-gfm-table: 2.0.0
@@ -10376,7 +10308,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- mdast-util-mdx-expression@2.0.0:
+ mdast-util-mdx-expression@2.0.1:
dependencies:
'@types/estree-jsx': 1.0.5
'@types/hast': 3.0.4
@@ -10387,19 +10319,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
- mdast-util-mdx-jsx@3.1.2:
+ mdast-util-mdx-jsx@3.1.3:
dependencies:
'@types/estree-jsx': 1.0.5
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
ccount: 2.0.1
devlop: 1.1.0
mdast-util-from-markdown: 2.0.1
mdast-util-to-markdown: 2.1.0
parse-entities: 4.0.1
stringify-entities: 4.0.4
- unist-util-remove-position: 5.0.0
unist-util-stringify-position: 4.0.0
vfile-message: 4.0.2
transitivePeerDependencies:
@@ -10408,8 +10339,8 @@ snapshots:
mdast-util-mdx@3.0.0:
dependencies:
mdast-util-from-markdown: 2.0.1
- mdast-util-mdx-expression: 2.0.0
- mdast-util-mdx-jsx: 3.1.2
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
mdast-util-mdxjs-esm: 2.0.1
mdast-util-to-markdown: 2.1.0
transitivePeerDependencies:
@@ -10441,12 +10372,12 @@ snapshots:
trim-lines: 3.0.1
unist-util-position: 5.0.0
unist-util-visit: 5.0.0
- vfile: 6.0.1
+ vfile: 6.0.3
mdast-util-to-markdown@2.1.0:
dependencies:
'@types/mdast': 4.0.4
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
longest-streak: 3.1.0
mdast-util-phrasing: 4.1.0
mdast-util-to-string: 4.0.0
@@ -10468,7 +10399,7 @@ snapshots:
dependencies:
fs-monkey: 1.0.6
- merge-descriptors@1.0.1: {}
+ merge-descriptors@1.0.3: {}
merge-stream@2.0.0: {}
@@ -10495,7 +10426,7 @@ snapshots:
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
- micromark-extension-directive@3.0.0:
+ micromark-extension-directive@3.0.2:
dependencies:
devlop: 1.1.0
micromark-factory-space: 2.0.0
@@ -10572,24 +10503,25 @@ snapshots:
micromark-extension-mdx-expression@3.0.0:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
devlop: 1.1.0
- micromark-factory-mdx-expression: 2.0.1
+ micromark-factory-mdx-expression: 2.0.2
micromark-factory-space: 2.0.0
micromark-util-character: 2.1.0
micromark-util-events-to-acorn: 2.0.2
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
- micromark-extension-mdx-jsx@3.0.0:
+ micromark-extension-mdx-jsx@3.0.1:
dependencies:
'@types/acorn': 4.0.6
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
devlop: 1.1.0
estree-util-is-identifier-name: 3.0.0
- micromark-factory-mdx-expression: 2.0.1
+ micromark-factory-mdx-expression: 2.0.2
micromark-factory-space: 2.0.0
micromark-util-character: 2.1.0
+ micromark-util-events-to-acorn: 2.0.2
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
vfile-message: 4.0.2
@@ -10600,7 +10532,7 @@ snapshots:
micromark-extension-mdxjs-esm@3.0.0:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
devlop: 1.1.0
micromark-core-commonmark: 2.0.1
micromark-util-character: 2.1.0
@@ -10615,7 +10547,7 @@ snapshots:
acorn: 8.12.1
acorn-jsx: 5.3.2(acorn@8.12.1)
micromark-extension-mdx-expression: 3.0.0
- micromark-extension-mdx-jsx: 3.0.0
+ micromark-extension-mdx-jsx: 3.0.1
micromark-extension-mdx-md: 2.0.0
micromark-extension-mdxjs-esm: 3.0.0
micromark-util-combine-extensions: 2.0.0
@@ -10634,10 +10566,11 @@ snapshots:
micromark-util-symbol: 2.0.0
micromark-util-types: 2.0.0
- micromark-factory-mdx-expression@2.0.1:
+ micromark-factory-mdx-expression@2.0.2:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
devlop: 1.1.0
+ micromark-factory-space: 2.0.0
micromark-util-character: 2.1.0
micromark-util-events-to-acorn: 2.0.2
micromark-util-symbol: 2.0.0
@@ -10710,8 +10643,8 @@ snapshots:
micromark-util-events-to-acorn@2.0.2:
dependencies:
'@types/acorn': 4.0.6
- '@types/estree': 1.0.5
- '@types/unist': 3.0.2
+ '@types/estree': 1.0.6
+ '@types/unist': 3.0.3
devlop: 1.1.0
estree-util-visit: 2.0.0
micromark-util-symbol: 2.0.0
@@ -10752,7 +10685,7 @@ snapshots:
micromark@4.0.0:
dependencies:
'@types/debug': 4.1.12
- debug: 4.3.5
+ debug: 4.3.7
decode-named-character-reference: 1.0.2
devlop: 1.1.0
micromark-core-commonmark: 2.0.1
@@ -10771,7 +10704,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- micromatch@4.0.7:
+ micromatch@4.0.8:
dependencies:
braces: 3.0.3
picomatch: 2.3.1
@@ -10780,6 +10713,8 @@ snapshots:
mime-db@1.52.0: {}
+ mime-db@1.53.0: {}
+
mime-types@2.1.18:
dependencies:
mime-db: 1.33.0
@@ -10796,11 +10731,11 @@ snapshots:
mimic-response@4.0.0: {}
- mini-css-extract-plugin@2.9.0(webpack@5.92.1):
+ mini-css-extract-plugin@2.9.1(webpack@5.95.0):
dependencies:
schema-utils: 4.2.0
tapable: 2.2.1
- webpack: 5.92.1
+ webpack: 5.95.0
minimalistic-assert@1.0.1: {}
@@ -10814,23 +10749,23 @@ snapshots:
minimist@1.2.8: {}
- mobx-react-lite@4.0.7(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ mobx-react-lite@4.0.7(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- mobx: 6.13.0
+ mobx: 6.13.5
react: 18.3.1
use-sync-external-store: 1.2.2(react@18.3.1)
optionalDependencies:
react-dom: 18.3.1(react@18.3.1)
- mobx-react@9.1.1(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ mobx-react@9.1.1(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- mobx: 6.13.0
- mobx-react-lite: 4.0.7(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ mobx: 6.13.5
+ mobx-react-lite: 4.0.7(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
optionalDependencies:
react-dom: 18.3.1(react@18.3.1)
- mobx@6.13.0: {}
+ mobx@6.13.5: {}
moo@0.5.2: {}
@@ -10838,8 +10773,6 @@ snapshots:
ms@2.0.0: {}
- ms@2.1.2: {}
-
ms@2.1.3: {}
multicast-dns@7.2.5:
@@ -10863,7 +10796,7 @@ snapshots:
no-case@3.0.4:
dependencies:
lower-case: 2.0.2
- tslib: 2.6.3
+ tslib: 2.8.0
node-emoji@2.1.3:
dependencies:
@@ -10886,7 +10819,7 @@ snapshots:
dependencies:
es6-promise: 3.3.1
- node-releases@2.0.14: {}
+ node-releases@2.0.18: {}
normalize-path@3.0.0: {}
@@ -10904,7 +10837,7 @@ snapshots:
dependencies:
boolbase: 1.0.0
- nwsapi@2.2.10: {}
+ nwsapi@2.2.13: {}
oas-kit-common@1.0.8:
dependencies:
@@ -11035,15 +10968,15 @@ snapshots:
package-json@8.1.1:
dependencies:
- got: 14.4.1
+ got: 14.4.3
registry-auth-token: 5.0.2
registry-url: 6.0.1
- semver: 7.6.2
+ semver: 7.6.3
param-case@3.0.4:
dependencies:
dot-case: 3.0.4
- tslib: 2.6.3
+ tslib: 2.8.0
parent-module@1.0.1:
dependencies:
@@ -11051,7 +10984,7 @@ snapshots:
parse-entities@4.0.1:
dependencies:
- '@types/unist': 2.0.10
+ '@types/unist': 2.0.11
character-entities: 2.0.2
character-entities-legacy: 3.0.0
character-reference-invalid: 2.0.1
@@ -11062,28 +10995,36 @@ snapshots:
parse-json@5.2.0:
dependencies:
- '@babel/code-frame': 7.24.7
+ '@babel/code-frame': 7.26.0
error-ex: 1.3.2
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
parse-numeric-range@1.3.0: {}
- parse5-htmlparser2-tree-adapter@7.0.0:
+ parse5-htmlparser2-tree-adapter@7.1.0:
dependencies:
domhandler: 5.0.3
- parse5: 7.1.2
+ parse5: 7.2.0
+
+ parse5-parser-stream@7.1.2:
+ dependencies:
+ parse5: 7.2.0
parse5@7.1.2:
dependencies:
entities: 4.5.0
+ parse5@7.2.0:
+ dependencies:
+ entities: 4.5.0
+
parseurl@1.3.3: {}
pascal-case@3.1.2:
dependencies:
no-case: 3.0.4
- tslib: 2.6.3
+ tslib: 2.8.0
path-browserify@1.0.1: {}
@@ -11101,13 +11042,7 @@ snapshots:
path-parse@1.0.7: {}
- path-to-regexp@0.1.7: {}
-
- path-to-regexp@1.8.0:
- dependencies:
- isarray: 0.0.1
-
- path-to-regexp@2.2.1: {}
+ path-to-regexp@3.3.0: {}
path-type@4.0.0: {}
@@ -11117,11 +11052,13 @@ snapshots:
periscopic@3.1.0:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-walker: 3.0.3
is-reference: 3.0.2
- picocolors@1.0.1: {}
+ picocolors@1.1.0: {}
+
+ picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -11137,231 +11074,235 @@ snapshots:
polished@4.3.1:
dependencies:
- '@babel/runtime': 7.24.7
+ '@babel/runtime': 7.26.0
possible-typed-array-names@1.0.0: {}
- postcss-calc@9.0.1(postcss@8.4.39):
+ postcss-calc@9.0.1(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
- postcss-selector-parser: 6.1.0
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
postcss-value-parser: 4.2.0
- postcss-colormin@6.1.0(postcss@8.4.39):
+ postcss-colormin@6.1.0(postcss@8.4.47):
dependencies:
- browserslist: 4.23.1
+ browserslist: 4.24.2
caniuse-api: 3.0.0
colord: 2.9.3
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-convert-values@6.1.0(postcss@8.4.39):
+ postcss-convert-values@6.1.0(postcss@8.4.47):
dependencies:
- browserslist: 4.23.1
- postcss: 8.4.39
+ browserslist: 4.24.2
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-discard-comments@6.0.2(postcss@8.4.39):
+ postcss-discard-comments@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-discard-duplicates@6.0.3(postcss@8.4.39):
+ postcss-discard-duplicates@6.0.3(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-discard-empty@6.0.3(postcss@8.4.39):
+ postcss-discard-empty@6.0.3(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-discard-overridden@6.0.2(postcss@8.4.39):
+ postcss-discard-overridden@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-discard-unused@6.0.5(postcss@8.4.39):
+ postcss-discard-unused@6.0.5(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
- postcss-selector-parser: 6.1.0
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
- postcss-loader@7.3.4(postcss@8.4.39)(typescript@5.5.3)(webpack@5.92.1):
+ postcss-loader@7.3.4(postcss@8.4.47)(typescript@5.6.3)(webpack@5.95.0):
dependencies:
- cosmiconfig: 8.3.6(typescript@5.5.3)
+ cosmiconfig: 8.3.6(typescript@5.6.3)
jiti: 1.21.6
- postcss: 8.4.39
- semver: 7.6.2
- webpack: 5.92.1
+ postcss: 8.4.47
+ semver: 7.6.3
+ webpack: 5.95.0
transitivePeerDependencies:
- typescript
- postcss-merge-idents@6.0.3(postcss@8.4.39):
+ postcss-merge-idents@6.0.3(postcss@8.4.47):
dependencies:
- cssnano-utils: 4.0.2(postcss@8.4.39)
- postcss: 8.4.39
+ cssnano-utils: 4.0.2(postcss@8.4.47)
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-merge-longhand@6.0.5(postcss@8.4.39):
+ postcss-merge-longhand@6.0.5(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- stylehacks: 6.1.1(postcss@8.4.39)
+ stylehacks: 6.1.1(postcss@8.4.47)
- postcss-merge-rules@6.1.1(postcss@8.4.39):
+ postcss-merge-rules@6.1.1(postcss@8.4.47):
dependencies:
- browserslist: 4.23.1
+ browserslist: 4.24.2
caniuse-api: 3.0.0
- cssnano-utils: 4.0.2(postcss@8.4.39)
- postcss: 8.4.39
- postcss-selector-parser: 6.1.0
+ cssnano-utils: 4.0.2(postcss@8.4.47)
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
- postcss-minify-font-values@6.1.0(postcss@8.4.39):
+ postcss-minify-font-values@6.1.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-minify-gradients@6.0.3(postcss@8.4.39):
+ postcss-minify-gradients@6.0.3(postcss@8.4.47):
dependencies:
colord: 2.9.3
- cssnano-utils: 4.0.2(postcss@8.4.39)
- postcss: 8.4.39
+ cssnano-utils: 4.0.2(postcss@8.4.47)
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-minify-params@6.1.0(postcss@8.4.39):
+ postcss-minify-params@6.1.0(postcss@8.4.47):
dependencies:
- browserslist: 4.23.1
- cssnano-utils: 4.0.2(postcss@8.4.39)
- postcss: 8.4.39
+ browserslist: 4.24.2
+ cssnano-utils: 4.0.2(postcss@8.4.47)
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-minify-selectors@6.0.4(postcss@8.4.39):
+ postcss-minify-selectors@6.0.4(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
- postcss-selector-parser: 6.1.0
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
- postcss-modules-extract-imports@3.1.0(postcss@8.4.39):
+ postcss-modules-extract-imports@3.1.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-modules-local-by-default@4.0.5(postcss@8.4.39):
+ postcss-modules-local-by-default@4.0.5(postcss@8.4.47):
dependencies:
- icss-utils: 5.1.0(postcss@8.4.39)
- postcss: 8.4.39
- postcss-selector-parser: 6.1.0
+ icss-utils: 5.1.0(postcss@8.4.47)
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
postcss-value-parser: 4.2.0
- postcss-modules-scope@3.2.0(postcss@8.4.39):
+ postcss-modules-scope@3.2.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
- postcss-selector-parser: 6.1.0
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
- postcss-modules-values@4.0.0(postcss@8.4.39):
+ postcss-modules-values@4.0.0(postcss@8.4.47):
dependencies:
- icss-utils: 5.1.0(postcss@8.4.39)
- postcss: 8.4.39
+ icss-utils: 5.1.0(postcss@8.4.47)
+ postcss: 8.4.47
- postcss-normalize-charset@6.0.2(postcss@8.4.39):
+ postcss-normalize-charset@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-normalize-display-values@6.0.2(postcss@8.4.39):
+ postcss-normalize-display-values@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-normalize-positions@6.0.2(postcss@8.4.39):
+ postcss-normalize-positions@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-normalize-repeat-style@6.0.2(postcss@8.4.39):
+ postcss-normalize-repeat-style@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-normalize-string@6.0.2(postcss@8.4.39):
+ postcss-normalize-string@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-normalize-timing-functions@6.0.2(postcss@8.4.39):
+ postcss-normalize-timing-functions@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-normalize-unicode@6.1.0(postcss@8.4.39):
+ postcss-normalize-unicode@6.1.0(postcss@8.4.47):
dependencies:
- browserslist: 4.23.1
- postcss: 8.4.39
+ browserslist: 4.24.2
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-normalize-url@6.0.2(postcss@8.4.39):
+ postcss-normalize-url@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-normalize-whitespace@6.0.2(postcss@8.4.39):
+ postcss-normalize-whitespace@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-ordered-values@6.0.2(postcss@8.4.39):
+ postcss-ordered-values@6.0.2(postcss@8.4.47):
dependencies:
- cssnano-utils: 4.0.2(postcss@8.4.39)
- postcss: 8.4.39
+ cssnano-utils: 4.0.2(postcss@8.4.47)
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-reduce-idents@6.0.3(postcss@8.4.39):
+ postcss-prefix-selector@1.16.1(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
+
+ postcss-reduce-idents@6.0.3(postcss@8.4.47):
+ dependencies:
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-reduce-initial@6.1.0(postcss@8.4.39):
+ postcss-reduce-initial@6.1.0(postcss@8.4.47):
dependencies:
- browserslist: 4.23.1
+ browserslist: 4.24.2
caniuse-api: 3.0.0
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-reduce-transforms@6.0.2(postcss@8.4.39):
+ postcss-reduce-transforms@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
- postcss-selector-parser@6.1.0:
+ postcss-selector-parser@6.1.2:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
- postcss-sort-media-queries@5.2.0(postcss@8.4.39):
+ postcss-sort-media-queries@5.2.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
sort-css-media-queries: 2.2.0
- postcss-svgo@6.0.3(postcss@8.4.39):
+ postcss-svgo@6.0.3(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss-value-parser: 4.2.0
svgo: 3.3.2
- postcss-unique-selectors@6.0.4(postcss@8.4.39):
+ postcss-unique-selectors@6.0.4(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
- postcss-selector-parser: 6.1.0
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
postcss-value-parser@4.2.0: {}
- postcss-zindex@6.0.2(postcss@8.4.39):
+ postcss-zindex@6.0.2(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
postcss@8.4.38:
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
- postcss@8.4.39:
+ postcss@8.4.47:
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
pretty-error@4.0.0:
dependencies:
@@ -11370,9 +11311,9 @@ snapshots:
pretty-time@1.1.0: {}
- prism-react-renderer@2.3.1(react@18.3.1):
+ prism-react-renderer@2.4.0(react@18.3.1):
dependencies:
- '@types/prismjs': 1.26.4
+ '@types/prismjs': 1.26.5
clsx: 2.1.1
react: 18.3.1
@@ -11402,22 +11343,16 @@ snapshots:
proxy-from-env@1.1.0: {}
- psl@1.9.0: {}
-
- punycode@1.4.1: {}
-
punycode@2.3.1: {}
pupa@3.1.0:
dependencies:
escape-goat: 4.0.0
- qs@6.11.0:
+ qs@6.13.0:
dependencies:
side-channel: 1.0.6
- querystringify@2.2.0: {}
-
queue-microtask@1.2.3: {}
queue@6.0.2:
@@ -11459,18 +11394,18 @@ snapshots:
minimist: 1.2.8
strip-json-comments: 2.0.1
- react-dev-utils@12.0.1(typescript@5.5.3)(webpack@5.92.1):
+ react-dev-utils@12.0.1(typescript@5.6.3)(webpack@5.95.0):
dependencies:
- '@babel/code-frame': 7.24.7
+ '@babel/code-frame': 7.26.0
address: 1.2.2
- browserslist: 4.23.1
+ browserslist: 4.24.2
chalk: 4.1.2
cross-spawn: 7.0.3
detect-port-alt: 1.1.6
escape-string-regexp: 4.0.0
filesize: 8.0.7
find-up: 5.0.0
- fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.5.3)(webpack@5.92.1)
+ fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.6.3)(webpack@5.95.0)
global-modules: 2.0.0
globby: 11.1.0
gzip-size: 6.0.0
@@ -11485,9 +11420,9 @@ snapshots:
shell-quote: 1.8.1
strip-ansi: 6.0.1
text-table: 0.2.0
- webpack: 5.92.1
+ webpack: 5.95.0
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- eslint
- supports-color
@@ -11505,7 +11440,7 @@ snapshots:
react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.24.7
+ '@babel/runtime': 7.26.0
invariant: 2.2.4
prop-types: 15.8.1
react: 18.3.1
@@ -11524,25 +11459,25 @@ snapshots:
react-is@18.3.1: {}
- react-json-view-lite@1.4.0(react@18.3.1):
+ react-json-view-lite@1.5.0(react@18.3.1):
dependencies:
react: 18.3.1
- react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.92.1):
+ react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.95.0):
dependencies:
- '@babel/runtime': 7.24.7
+ '@babel/runtime': 7.26.0
react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)'
- webpack: 5.92.1
+ webpack: 5.95.0
react-router-config@5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.24.7
+ '@babel/runtime': 7.26.0
react: 18.3.1
react-router: 5.3.4(react@18.3.1)
react-router-dom@5.3.4(react@18.3.1):
dependencies:
- '@babel/runtime': 7.24.7
+ '@babel/runtime': 7.26.0
history: 4.10.1
loose-envify: 1.4.0
prop-types: 15.8.1
@@ -11553,11 +11488,11 @@ snapshots:
react-router@5.3.4(react@18.3.1):
dependencies:
- '@babel/runtime': 7.24.7
+ '@babel/runtime': 7.26.0
history: 4.10.1
hoist-non-react-statics: 3.3.2
loose-envify: 1.4.0
- path-to-regexp: 1.8.0
+ path-to-regexp: 3.3.0
prop-types: 15.8.1
react: 18.3.1
react-is: 16.13.1
@@ -11606,25 +11541,55 @@ snapshots:
dependencies:
resolve: 1.22.8
+ recma-build-jsx@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-util-build-jsx: 3.0.1
+ vfile: 6.0.3
+
+ recma-jsx@1.0.0(acorn@8.13.0):
+ dependencies:
+ acorn-jsx: 5.3.2(acorn@8.13.0)
+ estree-util-to-js: 2.0.0
+ recma-parse: 1.0.0
+ recma-stringify: 1.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - acorn
+
+ recma-parse@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ esast-util-from-js: 2.0.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ recma-stringify@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-util-to-js: 2.0.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
recursive-readdir@2.2.3:
dependencies:
minimatch: 3.1.2
- redoc@2.1.5(core-js@3.37.1)(enzyme@3.11.0)(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
+ redoc@2.1.5(core-js@3.38.1)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
dependencies:
'@cfaester/enzyme-adapter-react-18': 0.8.0(enzyme@3.11.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@redocly/openapi-core': 1.16.0
classnames: 2.5.1
- core-js: 3.37.1
+ core-js: 3.38.1
decko: 1.2.0
- dompurify: 3.1.6
+ dompurify: 3.1.7
eventemitter3: 5.0.1
json-pointer: 0.6.2
lunr: 2.3.9
mark.js: 8.11.1
marked: 4.3.0
- mobx: 6.13.0
- mobx-react: 9.1.1(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ mobx: 6.13.5
+ mobx-react: 9.1.1(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
openapi-sampler: 1.5.1
path-browserify: 1.0.1
perfect-scrollbar: 1.5.5
@@ -11636,7 +11601,7 @@ snapshots:
react-tabs: 6.0.2(react@18.3.1)
slugify: 1.4.7
stickyfill: 1.1.1
- styled-components: 6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
swagger2openapi: 7.0.8
url-template: 2.0.8
transitivePeerDependencies:
@@ -11645,12 +11610,12 @@ snapshots:
- react-native
- supports-color
- redocusaurus@2.1.1(@docusaurus/theme-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3))(core-js@3.37.1)(enzyme@3.11.0)(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.92.1):
+ redocusaurus@2.1.2(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3))(core-js@3.38.1)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(webpack@5.95.0):
dependencies:
- '@docusaurus/theme-common': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3)
- '@docusaurus/utils': 3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3)
- docusaurus-plugin-redoc: 2.1.1(@docusaurus/utils@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.5.3))(core-js@3.37.1)(enzyme@3.11.0)(mobx@6.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- docusaurus-theme-redoc: 2.1.1(@docusaurus/theme-common@3.4.0(@docusaurus/types@3.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3))(core-js@3.37.1)(enzyme@3.11.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(webpack@5.92.1)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3)
+ docusaurus-plugin-redoc: 2.1.1(@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.6.3))(core-js@3.38.1)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
+ docusaurus-theme-redoc: 2.1.2(@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@docusaurus/types@3.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(acorn@8.13.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(core-js@3.38.1)(enzyme@3.11.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(webpack@5.95.0)
transitivePeerDependencies:
- core-js
- encoding
@@ -11665,7 +11630,7 @@ snapshots:
reftools@1.1.9: {}
- regenerate-unicode-properties@10.1.1:
+ regenerate-unicode-properties@10.2.0:
dependencies:
regenerate: 1.4.2
@@ -11675,41 +11640,51 @@ snapshots:
regenerator-transform@0.15.2:
dependencies:
- '@babel/runtime': 7.24.7
+ '@babel/runtime': 7.26.0
- regexp.prototype.flags@1.5.2:
+ regexp.prototype.flags@1.5.3:
dependencies:
call-bind: 1.0.7
define-properties: 1.2.1
es-errors: 1.3.0
set-function-name: 2.0.2
- regexpu-core@5.3.2:
+ regexpu-core@6.1.1:
dependencies:
- '@babel/regjsgen': 0.8.0
regenerate: 1.4.2
- regenerate-unicode-properties: 10.1.1
- regjsparser: 0.9.1
+ regenerate-unicode-properties: 10.2.0
+ regjsgen: 0.8.0
+ regjsparser: 0.11.1
unicode-match-property-ecmascript: 2.0.0
- unicode-match-property-value-ecmascript: 2.1.0
+ unicode-match-property-value-ecmascript: 2.2.0
registry-auth-token@5.0.2:
dependencies:
- '@pnpm/npm-conf': 2.2.2
+ '@pnpm/npm-conf': 2.3.1
registry-url@6.0.1:
dependencies:
rc: 1.2.8
- regjsparser@0.9.1:
+ regjsgen@0.8.0: {}
+
+ regjsparser@0.11.1:
dependencies:
- jsesc: 0.5.0
+ jsesc: 3.0.2
rehype-raw@7.0.0:
dependencies:
'@types/hast': 3.0.4
hast-util-raw: 9.0.4
- vfile: 6.0.1
+ vfile: 6.0.3
+
+ rehype-recma@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/hast': 3.0.4
+ hast-util-to-estree: 3.1.0
+ transitivePeerDependencies:
+ - supports-color
relateurl@0.2.7: {}
@@ -11717,7 +11692,7 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
mdast-util-directive: 3.0.0
- micromark-extension-directive: 3.0.0
+ micromark-extension-directive: 3.0.2
unified: 11.0.5
transitivePeerDependencies:
- supports-color
@@ -11725,7 +11700,7 @@ snapshots:
remark-emoji@4.0.1:
dependencies:
'@types/mdast': 4.0.4
- emoticon: 4.0.1
+ emoticon: 4.1.0
mdast-util-find-and-replace: 3.0.1
node-emoji: 2.1.3
unified: 11.0.5
@@ -11757,6 +11732,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ remark-mdx@3.1.0:
+ dependencies:
+ mdast-util-mdx: 3.0.0
+ micromark-extension-mdxjs: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
remark-parse@11.0.0:
dependencies:
'@types/mdast': 4.0.4
@@ -11766,13 +11748,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
- remark-rehype@11.1.0:
+ remark-rehype@11.1.1:
dependencies:
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
mdast-util-to-hast: 13.2.0
unified: 11.0.5
- vfile: 6.0.1
+ vfile: 6.0.3
remark-stringify@11.0.0:
dependencies:
@@ -11806,7 +11788,7 @@ snapshots:
resolve@1.22.8:
dependencies:
- is-core-module: 2.14.0
+ is-core-module: 2.15.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
@@ -11824,8 +11806,6 @@ snapshots:
dependencies:
glob: 7.2.3
- rrweb-cssom@0.6.0: {}
-
rrweb-cssom@0.7.1: {}
rst-selector-parser@2.2.3:
@@ -11835,11 +11815,11 @@ snapshots:
rtl-detect@1.1.2: {}
- rtlcss@4.1.1:
+ rtlcss@4.3.0:
dependencies:
- escalade: 3.1.2
- picocolors: 1.0.1
- postcss: 8.4.39
+ escalade: 3.2.0
+ picocolors: 1.1.0
+ postcss: 8.4.47
strip-json-comments: 3.1.1
run-parallel@1.2.0:
@@ -11848,7 +11828,7 @@ snapshots:
rxjs@7.8.1:
dependencies:
- tslib: 2.6.3
+ tslib: 2.8.0
safe-array-concat@1.1.2:
dependencies:
@@ -11894,11 +11874,11 @@ snapshots:
schema-utils@4.2.0:
dependencies:
'@types/json-schema': 7.0.15
- ajv: 8.16.0
- ajv-formats: 2.1.1(ajv@8.16.0)
- ajv-keywords: 5.1.0(ajv@8.16.0)
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ ajv-keywords: 5.1.0(ajv@8.17.1)
- search-insights@2.14.0: {}
+ search-insights@2.17.2: {}
section-matter@1.0.0:
dependencies:
@@ -11914,13 +11894,13 @@ snapshots:
semver-diff@4.0.0:
dependencies:
- semver: 7.6.2
+ semver: 7.6.3
semver@6.3.1: {}
- semver@7.6.2: {}
+ semver@7.6.3: {}
- send@0.18.0:
+ send@0.19.0:
dependencies:
debug: 2.6.9
depd: 2.0.0
@@ -11942,15 +11922,14 @@ snapshots:
dependencies:
randombytes: 2.1.0
- serve-handler@6.1.5:
+ serve-handler@6.1.6:
dependencies:
bytes: 3.0.0
content-disposition: 0.5.2
- fast-url-parser: 1.1.3
mime-types: 2.1.18
minimatch: 3.1.2
path-is-inside: 1.0.2
- path-to-regexp: 2.2.1
+ path-to-regexp: 3.3.0
range-parser: 1.2.0
serve-index@1.9.1:
@@ -11965,12 +11944,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- serve-static@1.15.0:
+ serve-static@1.16.2:
dependencies:
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
parseurl: 1.3.3
- send: 0.18.0
+ send: 0.19.0
transitivePeerDependencies:
- supports-color
@@ -12051,7 +12030,7 @@ snapshots:
sirv@2.0.4:
dependencies:
- '@polka/url': 1.0.0-next.25
+ '@polka/url': 1.0.0-next.28
mrmime: 2.0.0
totalist: 3.0.1
@@ -12077,7 +12056,7 @@ snapshots:
snake-case@3.0.4:
dependencies:
dot-case: 3.0.4
- tslib: 2.6.3
+ tslib: 2.8.0
sockjs@0.3.24:
dependencies:
@@ -12089,7 +12068,7 @@ snapshots:
source-list-map@2.0.1: {}
- source-map-js@1.2.0: {}
+ source-map-js@1.2.1: {}
source-map-support@0.5.21:
dependencies:
@@ -12102,11 +12081,9 @@ snapshots:
space-separated-tokens@2.0.2: {}
- spawn-command@0.0.2: {}
-
spdy-transport@3.0.0:
dependencies:
- debug: 4.3.5
+ debug: 4.3.7
detect-node: 2.1.0
hpack.js: 2.1.6
obuf: 1.1.2
@@ -12117,7 +12094,7 @@ snapshots:
spdy@4.0.2:
dependencies:
- debug: 4.3.5
+ debug: 4.3.7
handle-thing: 2.0.1
http-deceiver: 1.2.7
select-hose: 2.0.0
@@ -12193,7 +12170,7 @@ snapshots:
strip-ansi@7.1.0:
dependencies:
- ansi-regex: 6.0.1
+ ansi-regex: 6.1.0
strip-bom-string@1.0.0: {}
@@ -12207,11 +12184,11 @@ snapshots:
dependencies:
inline-style-parser: 0.1.1
- style-to-object@1.0.6:
+ style-to-object@1.0.8:
dependencies:
- inline-style-parser: 0.2.3
+ inline-style-parser: 0.2.4
- styled-components@6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@emotion/is-prop-valid': 1.2.2
'@emotion/unitless': 0.8.1
@@ -12225,18 +12202,14 @@ snapshots:
stylis: 4.3.2
tslib: 2.6.2
- stylehacks@6.1.1(postcss@8.4.39):
+ stylehacks@6.1.1(postcss@8.4.47):
dependencies:
- browserslist: 4.23.1
- postcss: 8.4.39
- postcss-selector-parser: 6.1.0
+ browserslist: 4.24.2
+ postcss: 8.4.47
+ postcss-selector-parser: 6.1.2
stylis@4.3.2: {}
- supports-color@5.5.0:
- dependencies:
- has-flag: 3.0.0
-
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -12257,7 +12230,7 @@ snapshots:
css-tree: 2.3.1
css-what: 6.1.0
csso: 5.0.5
- picocolors: 1.0.1
+ picocolors: 1.1.1
swagger2openapi@7.0.8:
dependencies:
@@ -12281,19 +12254,19 @@ snapshots:
tapable@2.2.1: {}
- terser-webpack-plugin@5.3.10(webpack@5.92.1):
+ terser-webpack-plugin@5.3.10(webpack@5.95.0):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
jest-worker: 27.5.1
schema-utils: 3.3.0
serialize-javascript: 6.0.2
- terser: 5.31.1
- webpack: 5.92.1
+ terser: 5.36.0
+ webpack: 5.95.0
- terser@5.31.1:
+ terser@5.36.0:
dependencies:
'@jridgewell/source-map': 0.3.6
- acorn: 8.12.1
+ acorn: 8.13.0
commander: 2.20.3
source-map-support: 0.5.21
@@ -12305,7 +12278,11 @@ snapshots:
tiny-warning@1.0.3: {}
- to-fast-properties@2.0.0: {}
+ tldts-core@6.1.50: {}
+
+ tldts@6.1.50:
+ dependencies:
+ tldts-core: 6.1.50
to-regex-range@5.0.1:
dependencies:
@@ -12315,12 +12292,9 @@ snapshots:
totalist@3.0.1: {}
- tough-cookie@4.1.4:
+ tough-cookie@5.0.0:
dependencies:
- psl: 1.9.0
- punycode: 2.3.1
- universalify: 0.2.0
- url-parse: 1.5.10
+ tldts: 6.1.50
tr46@0.0.3: {}
@@ -12336,13 +12310,13 @@ snapshots:
tslib@2.6.2: {}
- tslib@2.6.3: {}
+ tslib@2.8.0: {}
type-fest@1.4.0: {}
type-fest@2.19.0: {}
- type-fest@4.21.0: {}
+ type-fest@4.26.1: {}
type-is@1.6.18:
dependencies:
@@ -12385,7 +12359,7 @@ snapshots:
dependencies:
is-typedarray: 1.0.0
- typescript@5.5.3: {}
+ typescript@5.6.3: {}
unbox-primitive@1.0.2:
dependencies:
@@ -12394,30 +12368,32 @@ snapshots:
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
- undici-types@5.26.5: {}
+ undici-types@6.19.8: {}
- unicode-canonical-property-names-ecmascript@2.0.0: {}
+ undici@6.20.1: {}
+
+ unicode-canonical-property-names-ecmascript@2.0.1: {}
unicode-emoji-modifier-base@1.0.0: {}
unicode-match-property-ecmascript@2.0.0:
dependencies:
- unicode-canonical-property-names-ecmascript: 2.0.0
+ unicode-canonical-property-names-ecmascript: 2.0.1
unicode-property-aliases-ecmascript: 2.1.0
- unicode-match-property-value-ecmascript@2.1.0: {}
+ unicode-match-property-value-ecmascript@2.2.0: {}
unicode-property-aliases-ecmascript@2.1.0: {}
unified@11.0.5:
dependencies:
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
bail: 2.0.2
devlop: 1.1.0
extend: 3.0.2
is-plain-obj: 4.1.0
trough: 2.2.0
- vfile: 6.0.1
+ vfile: 6.0.3
unique-string@3.0.0:
dependencies:
@@ -12425,47 +12401,40 @@ snapshots:
unist-util-is@6.0.0:
dependencies:
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
unist-util-position-from-estree@2.0.0:
dependencies:
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
unist-util-position@5.0.0:
dependencies:
- '@types/unist': 3.0.2
-
- unist-util-remove-position@5.0.0:
- dependencies:
- '@types/unist': 3.0.2
- unist-util-visit: 5.0.0
+ '@types/unist': 3.0.3
unist-util-stringify-position@4.0.0:
dependencies:
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
unist-util-visit-parents@6.0.1:
dependencies:
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
unist-util-is: 6.0.0
unist-util-visit@5.0.0:
dependencies:
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
unist-util-is: 6.0.0
unist-util-visit-parents: 6.0.1
- universalify@0.2.0: {}
-
universalify@2.0.1: {}
unpipe@1.0.0: {}
- update-browserslist-db@1.1.0(browserslist@4.23.1):
+ update-browserslist-db@1.1.1(browserslist@4.24.2):
dependencies:
- browserslist: 4.23.1
- escalade: 3.1.2
- picocolors: 1.0.1
+ browserslist: 4.24.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
update-notifier@6.0.2:
dependencies:
@@ -12480,27 +12449,24 @@ snapshots:
is-yarn-global: 0.4.1
latest-version: 7.0.0
pupa: 3.1.0
- semver: 7.6.2
+ semver: 7.6.3
semver-diff: 4.0.0
xdg-basedir: 5.1.0
+ uri-js-replace@1.0.1: {}
+
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
- url-loader@4.1.1(file-loader@6.2.0(webpack@5.92.1))(webpack@5.92.1):
+ url-loader@4.1.1(file-loader@6.2.0(webpack@5.95.0))(webpack@5.95.0):
dependencies:
loader-utils: 2.0.4
mime-types: 2.1.35
schema-utils: 3.3.0
- webpack: 5.92.1
+ webpack: 5.95.0
optionalDependencies:
- file-loader: 6.2.0(webpack@5.92.1)
-
- url-parse@1.5.10:
- dependencies:
- querystringify: 2.2.0
- requires-port: 1.0.0
+ file-loader: 6.2.0(webpack@5.95.0)
url-template@2.0.8: {}
@@ -12522,27 +12488,26 @@ snapshots:
vary@1.1.2: {}
- vfile-location@5.0.2:
+ vfile-location@5.0.3:
dependencies:
- '@types/unist': 3.0.2
- vfile: 6.0.1
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
vfile-message@4.0.2:
dependencies:
- '@types/unist': 3.0.2
+ '@types/unist': 3.0.3
unist-util-stringify-position: 4.0.0
- vfile@6.0.1:
+ vfile@6.0.3:
dependencies:
- '@types/unist': 3.0.2
- unist-util-stringify-position: 4.0.0
+ '@types/unist': 3.0.3
vfile-message: 4.0.2
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0
- watchpack@2.4.1:
+ watchpack@2.4.2:
dependencies:
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
@@ -12560,31 +12525,31 @@ snapshots:
webpack-bundle-analyzer@4.10.2:
dependencies:
'@discoveryjs/json-ext': 0.5.7
- acorn: 8.12.1
- acorn-walk: 8.3.3
+ acorn: 8.13.0
+ acorn-walk: 8.3.4
commander: 7.2.0
debounce: 1.2.1
escape-string-regexp: 4.0.0
gzip-size: 6.0.0
html-escaper: 2.0.2
opener: 1.5.2
- picocolors: 1.0.1
+ picocolors: 1.1.1
sirv: 2.0.4
ws: 7.5.10
transitivePeerDependencies:
- bufferutil
- utf-8-validate
- webpack-dev-middleware@5.3.4(webpack@5.92.1):
+ webpack-dev-middleware@5.3.4(webpack@5.95.0):
dependencies:
colorette: 2.0.20
memfs: 3.5.3
mime-types: 2.1.35
range-parser: 1.2.1
schema-utils: 4.2.0
- webpack: 5.92.1
+ webpack: 5.95.0
- webpack-dev-server@4.15.2(debug@4.3.5)(webpack@5.92.1):
+ webpack-dev-server@4.15.2(debug@4.3.7)(webpack@5.95.0):
dependencies:
'@types/bonjour': 3.5.13
'@types/connect-history-api-fallback': 1.5.4
@@ -12592,7 +12557,7 @@ snapshots:
'@types/serve-index': 1.9.4
'@types/serve-static': 1.15.7
'@types/sockjs': 0.3.36
- '@types/ws': 8.5.10
+ '@types/ws': 8.5.12
ansi-html-community: 0.0.8
bonjour-service: 1.2.1
chokidar: 3.6.0
@@ -12600,12 +12565,12 @@ snapshots:
compression: 1.7.4
connect-history-api-fallback: 2.0.0
default-gateway: 6.0.3
- express: 4.19.2
+ express: 4.21.1
graceful-fs: 4.2.11
html-entities: 2.5.2
- http-proxy-middleware: 2.0.6(@types/express@4.17.21)(debug@4.3.5)
+ http-proxy-middleware: 2.0.7(@types/express@4.17.21)(debug@4.3.7)
ipaddr.js: 2.2.0
- launch-editor: 2.8.0
+ launch-editor: 2.9.1
open: 8.4.2
p-retry: 4.6.2
rimraf: 3.0.2
@@ -12614,10 +12579,10 @@ snapshots:
serve-index: 1.9.1
sockjs: 0.3.24
spdy: 4.0.2
- webpack-dev-middleware: 5.3.4(webpack@5.92.1)
+ webpack-dev-middleware: 5.3.4(webpack@5.95.0)
ws: 8.18.0
optionalDependencies:
- webpack: 5.92.1
+ webpack: 5.95.0
transitivePeerDependencies:
- bufferutil
- debug
@@ -12637,18 +12602,17 @@ snapshots:
webpack-sources@3.2.3: {}
- webpack@5.92.1:
+ webpack@5.95.0:
dependencies:
- '@types/eslint-scope': 3.7.7
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
'@webassemblyjs/ast': 1.12.1
'@webassemblyjs/wasm-edit': 1.12.1
'@webassemblyjs/wasm-parser': 1.12.1
- acorn: 8.12.1
- acorn-import-attributes: 1.9.5(acorn@8.12.1)
- browserslist: 4.23.1
+ acorn: 8.13.0
+ acorn-import-attributes: 1.9.5(acorn@8.13.0)
+ browserslist: 4.24.2
chrome-trace-event: 1.0.4
- enhanced-resolve: 5.17.0
+ enhanced-resolve: 5.17.1
es-module-lexer: 1.5.4
eslint-scope: 5.1.1
events: 3.3.0
@@ -12660,21 +12624,21 @@ snapshots:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
- terser-webpack-plugin: 5.3.10(webpack@5.92.1)
- watchpack: 2.4.1
+ terser-webpack-plugin: 5.3.10(webpack@5.95.0)
+ watchpack: 2.4.2
webpack-sources: 3.2.3
transitivePeerDependencies:
- '@swc/core'
- esbuild
- uglify-js
- webpackbar@5.0.2(webpack@5.92.1):
+ webpackbar@5.0.2(webpack@5.95.0):
dependencies:
chalk: 4.1.2
consola: 2.15.3
pretty-time: 1.1.0
std-env: 3.7.0
- webpack: 5.92.1
+ webpack: 5.95.0
websocket-driver@0.7.4:
dependencies:
@@ -12773,14 +12737,14 @@ snapshots:
yaml@1.10.2: {}
- yaml@2.4.5: {}
+ yaml@2.6.0: {}
yargs-parser@21.1.1: {}
yargs@17.7.2:
dependencies:
cliui: 8.0.1
- escalade: 3.1.2
+ escalade: 3.2.0
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
diff --git a/docs/src/pages/about.md b/docs/src/pages/about.md
new file mode 100644
index 000000000..bec3304a1
--- /dev/null
+++ b/docs/src/pages/about.md
@@ -0,0 +1,18 @@
+# About
+
+Woodpecker has been originally forked from Drone 0.8 as the Drone CI license was changed after the 0.8 release from Apache 2.0 to a proprietary license. Woodpecker is based on this latest freely available version.
+
+## History
+
+Woodpecker was originally forked by [@laszlocph](https://github.com/laszlocph) in 2019.
+
+A few important time points:
+
+- [`2fbaa56`](https://github.com/woodpecker-ci/woodpecker/commit/2fbaa56eee0f4be7a3ca4be03dbd00c1bf5d1274) is the first commit of the fork, made on Apr 3, 2019.
+- The first release [v0.8.91](https://github.com/woodpecker-ci/woodpecker/releases/tag/v0.8.91) was published on Apr 6, 2019.
+- On Aug 27, 2019, the project was renamed to "Woodpecker" ([`630c383`](https://github.com/woodpecker-ci/woodpecker/commit/630c383181b10c4ec375e500c812c4b76b3c52b8)).
+- The first release under the name "Woodpecker" was published on Sep 9, 2019 ([v0.8.104](https://github.com/woodpecker-ci/woodpecker/releases/tag/v0.8.104)).
+
+## Differences to Drone
+
+Woodpecker is a community-focused software that still stay free and open source forever, while Drone is managed by [Harness](https://harness.io/) and published under [Polyform Small Business](https://polyformproject.org/licenses/small-business/1.0.0/) license.
diff --git a/docs/docs/92-awesome.md b/docs/src/pages/awesome.md
similarity index 89%
rename from docs/docs/92-awesome.md
rename to docs/src/pages/awesome.md
index 920341d33..aac85d036 100644
--- a/docs/docs/92-awesome.md
+++ b/docs/src/pages/awesome.md
@@ -55,12 +55,18 @@ If you have some missing resources, please feel free to [open a pull-request](ht
- [Deploying mdbook to codeberg pages using woodpecker CI](https://www.markpitblado.me/blog/deploying-mdbook-to-codeberg-pages-using-woodpecker-ci/)
- [Deploy a Fly app with Woodpecker CI](https://joeroe.io/2024/01/09/deploy-fly-woodpecker-ci.html)
- [Ansible - using Woodpecker as an alternative to Semaphore](https://pat-s.me/ansible-using-woodpecker-as-an-alternative-to-semaphore/)
+- [Simple selfhosted CI/CD with Woodpecker](https://xyquadrat.ch/blog/simple-ci-with-woodpecker/)
+- [Notes to self on Woodpecker-CI](https://jpmens.net/2023/09/22/notes-to-self-on-woodpecker-ci/)
+- [CI/CD with Woodpecker and Gitea](https://wilw.dev/blog/2023/04/23/woodpecker-ci/)
## Videos
- [Replace Ansible Semaphore with Woodpecker CI](https://www.youtube.com/watch?v=d610YPvCB0E)
- ["unexpected EOF" error when trying to pair Woodpecker CI served through the Caddy with Gitea](https://www.youtube.com/watch?v=n7Hyvt71Np0)
- [CICD Environment in Docker Swarm behind Caddy Server - Part 2 Woodpeckerci](https://www.youtube.com/watch?v=rkbw_k7JvS0)
+- [How to Build & Publish Custom Docker Container using Gitea & Woodpecker behind Caddy Server | TUNEIT](https://www.youtube.com/watch?v=9m7DbgL1mNk)
+- [Radicle Woodpecker CI Integration](https://www.youtube.com/watch?v=Ks1nbYLn4P8)
+- [woodpecker-ci/woodpecker - Gource visualisation](https://www.youtube.com/watch?v=38JuakZ6m5s)
## Plugins
diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx
index 9fc47c2e5..0bddd28db 100644
--- a/docs/src/pages/index.tsx
+++ b/docs/src/pages/index.tsx
@@ -14,7 +14,7 @@ function HomepageHeader() {
{siteConfig.title}
{siteConfig.tagline}
-
+
Woodpecker Tutorial - 5min ⏱️
@@ -28,7 +28,7 @@ export default function Home() {
return (
diff --git a/docs/docs/91-migrations.md b/docs/src/pages/migrations.md
similarity index 66%
rename from docs/docs/91-migrations.md
rename to docs/src/pages/migrations.md
index 84a79ac5e..9b7639366 100644
--- a/docs/docs/91-migrations.md
+++ b/docs/src/pages/migrations.md
@@ -1,31 +1,80 @@
# Migrations
-Some versions need some changes to the server configuration or the pipeline configuration files.
-
-
+Some versions need some changes to the server configuration or the pipeline configuration files. If you are an user check the `User migrations` section of an version. As an admin of a Woodpecker server or agent check the `Admin migrations` section.
## `next`
-- Deprecated `steps.[name].group` in favor of `steps.[name].depends_on` (see [workflow syntax](./20-usage/20-workflow-syntax.md#depends_on) to learn how to set dependencies)
-- Removed `WOODPECKER_ROOT_PATH` and `WOODPECKER_ROOT_URL` config variables. Use `WOODPECKER_HOST` with a path instead
+:::info
+This will be the next version of Woodpecker.
+:::
+
+## User migrations
+
+- Removed built-in environment variables:
+ - `CI_COMMIT_URL` use `CI_PIPELINE_FORGE_URL`
+ - `CI_STEP_FINISHED` as empty during execution
+ - `CI_PIPELINE_FINISHED` as empty during execution
+ - `CI_PIPELINE_STATUS` was always `success`
+ - `CI_STEP_STATUS` was always `success`
+- Set `/woodpecker` as default workdir for the **woodpecker-cli** container
+- Secret filters for plugins now check against tag if specified
+- Compatibility mode of deprecated `pipeline:`, `platform:` and `branches:` pipeline config options are now removed and pipeline will now fail if still in use.
+- Removed `steps.[name].group` in favor of `steps.[name].depends_on` (see [workflow syntax](/docs/usage/workflow-syntax#depends_on) to learn how to set dependencies)
- Pipelines without a config file will now be skipped instead of failing
-- Deprecated `includes` and `excludes` support from **event** filter
-- Deprecated uppercasing all secret env vars, instead, the value of the `secrets` property is used. [Read more](./20-usage/40-secrets.md#use-secrets-in-commands)
-- Deprecated alternative names for secrets, use `environment` with `from_secret`
-- Deprecated slice definition for env vars
-- Deprecated `environment` filter, use `when.evaluate`
-- Use `WOODPECKER_EXPERT_FORGE_OAUTH_HOST` instead of `WOODPECKER_DEV_GITEA_OAUTH_URL` or `WOODPECKER_DEV_OAUTH_HOST`
-- Deprecated `WOODPECKER_WEBHOOK_HOST` in favor of `WOODPECKER_EXPERT_WEBHOOK_HOST`
+- Removed `includes` and `excludes` support from **event** filter
+- Removed upper-casing all secret env vars, instead, the value of the `secrets` property is used. [Read more](/docs/usage/secrets#usage)
+- Removed alternative names for secrets, use `environment` with `from_secret`
+- Removed `environment` filter, use `when.evaluate`
+- Removed `WOODPECKER_WEBHOOK_HOST` in favor of `WOODPECKER_EXPERT_WEBHOOK_HOST`
+- Renamed `start_time`, `end_time`, `created_at`, `started_at`, `finished_at` and `reviewed_at` JSON fields to `started`, `finished`, `created`, `started`, `finished`, `reviewed`
+- JSON field `trusted` on repo model was changed from boolean to object
+- Update all webhooks by pressing the "Repair all" button in the admin settings as the webhook token claims have changed
+- Crons now use standard Linux syntax without seconds
+- Removed old API routes: `registry/` -> `registries`, `/authorize/token`
+- Replaced `registry` command with `repo registry` in cli
+- Deprecated `secrets`, use `environment` with `from_secret`
+
+## Admin migrations
+
+- Deprecate `WOODPECKER_LOG_XORM` and `WOODPECKER_LOG_XORM_SQL` use `"WOODPECKER_DATABASE_LOG` and `"WOODPECKER_DATABASE_LOG_SQL`
+- Deprecate `WOODPECKER_FILTER_LABELS` use `WOODPECKER_AGENT_LABELS`
+- Move docker resource limit settings from server into agent configuration
+- Rename server environment variable `WOODPECKER_ESCALATE` to `WOODPECKER_PLUGINS_PRIVILEGED`
+- All default privileged plugins (like `woodpeckerci/plugin-docker-buildx`) were removed. Please carefully [re-add those plugins](/docs/next/administration/server-config#woodpecker_plugins_privileged) you trust and rely on.
+- `WOODPECKER_DEFAULT_CLONE_IMAGE` got deprecated use `WOODPECKER_DEFAULT_CLONE_PLUGIN`
+- Check trusted-clone- and privileged-plugins by image name and tag (if tag is set)
+- Removed `WOODPECKER_DEV_OAUTH_HOST` and `WOODPECKER_DEV_GITEA_OAUTH_URL` use `WOODPECKER_EXPERT_FORGE_OAUTH_HOST`
+- Removed `WOODPECKER_ROOT_PATH` and `WOODPECKER_ROOT_URL` config variables. Use `WOODPECKER_HOST` with a path instead
+- Removed implicitly defined `regcred` image pull secret name. Set it explicitly via `WOODPECKER_BACKEND_K8S_PULL_SECRET_NAMES`
+- Removed slice definition for env vars
+- Migrated to rfc9421 for webhook signatures
+- Replaced `configs` object by `netrc` in external configuration APIs
+- Disallow upgrades from 1.x, upgrade to 2.x first
+
+## 2.7.2
+
+To secure your instance, set `WOODPECKER_PLUGINS_PRIVILEGED` to only allow specific versions of the `woodpeckerci/plugin-docker-buildx` plugin, use version 5.0.0 or above. This prevents older, potentially unstable versions from being privileged.
+
+For example, to allow only version 5.0.0, use:
+
+```bash
+WOODPECKER_PLUGINS_PRIVILEGED=woodpeckerci/plugin-docker-buildx:5.0.0
+```
+
+To allow multiple versions, you can separate them with commas:
+
+```bash
+WOODPECKER_PLUGINS_PRIVILEGED=woodpeckerci/plugin-docker-buildx:5.0.0,woodpeckerci/plugin-docker-buildx:5.1.0
+```
+
+This setup ensures only specified, stable plugin versions are given privileged access.
+
+Read more about it in [#4213](https://github.com/woodpecker-ci/woodpecker/pull/4213)
## 2.0.0
- Dropped deprecated `CI_BUILD_*`, `CI_PREV_BUILD_*`, `CI_JOB_*`, `*_LINK`, `CI_SYSTEM_ARCH`, `CI_REPO_REMOTE` built-in environment variables
-- Deprecated `platform:` filter in favor of `labels:`, [read more](./20-usage/20-workflow-syntax.md#filter-by-platform)
+- Deprecated `platform:` filter in favor of `labels:`, [read more](/docs/usage/workflow-syntax#filter-by-platform)
- Secrets `event` property was renamed to `events` and `image` to `images` as both are lists. The new property `events` / `images` has to be used in the api. The old properties `event` and `image` were removed.
- The secrets `plugin_only` option was removed. Secrets with images are now always only available for plugins using listed by the `images` property. Existing secrets with a list of `images` will now only be available to the listed images if they are used as a plugin.
- Removed `build` alias for `pipeline` command in CLI
@@ -37,8 +86,8 @@ Some versions need some changes to the server configuration or the pipeline conf
## 1.0.0
-- The signature used to verify extension calls (like those used for the [config-extension](./30-administration/40-advanced/100-external-configuration-api.md)) done by the Woodpecker server switched from using a shared-secret HMac to an ed25519 key-pair. Read more about it at the [config-extensions](./30-administration/40-advanced/100-external-configuration-api.md) documentation.
-- Refactored support for old agent filter labels and expressions. Learn how to use the new [filter](./20-usage/20-workflow-syntax.md#labels)
+- The signature used to verify extension calls (like those used for the [config-extension](/docs/administration/advanced/external-configuration-api)) done by the Woodpecker server switched from using a shared-secret HMac to an ed25519 key-pair. Read more about it at the [config-extensions](/docs/administration/advanced/external-configuration-api) documentation.
+- Refactored support for old agent filter labels and expressions. Learn how to use the new [filter](/docs/usage/workflow-syntax#labels)
- Renamed step environment variable `CI_SYSTEM_ARCH` to `CI_SYSTEM_PLATFORM`. Same applies for the cli exec variable.
- Renamed environment variables `CI_BUILD_*` and `CI_PREV_BUILD_*` to `CI_PIPELINE_*` and `CI_PREV_PIPELINE_*`, old ones are still available but deprecated
- Renamed environment variables `CI_JOB_*` to `CI_STEP_*`, old ones are still available but deprecated
@@ -47,7 +96,7 @@ Some versions need some changes to the server configuration or the pipeline conf
- Renamed API endpoints for pipelines (`//builds/` -> `//pipelines/`), old ones are still available but deprecated
- Updated Prometheus gauge `build_*` to `pipeline_*`
- Updated Prometheus gauge `*_job_*` to `*_step_*`
-- Renamed config env `WOODPECKER_MAX_PROCS` to `WOODPECKER_MAX_WORKFLOWS` (still available as fallback)
+- Renamed config env `WOODPECKER_MAX_PROCS` to `WOODPECKER_MAX_WORKFLOWS` (still available as fallback)
- The pipelines are now also read from `.yaml` files, the new default order is `.woodpecker/*.yml` and `.woodpecker/*.yaml` (without any prioritization) -> `.woodpecker.yml` -> `.woodpecker.yaml`
- Dropped support for [Coding](https://coding.net/), [Gogs](https://gogs.io) and Bitbucket Server (Stash).
- `/api/queue/resume` & `/api/queue/pause` endpoint methods were changed from `GET` to `POST`
@@ -76,7 +125,7 @@ Some versions need some changes to the server configuration or the pipeline conf
Only projects created after updating will have an empty value by default. Existing projects will stick to the current pipeline path which is `.drone.yml` in most cases.
- Read more about it at the [Project Settings](./20-usage/75-project-settings.md#pipeline-path)
+ Read more about it at the [Project Settings](/docs/usage/project-settings#pipeline-path)
- From version `0.15.0` ongoing there will be three types of docker images: `latest`, `next` and `x.x.x` with an alpine variant for each type like `latest-alpine`.
If you used `latest` before to try pre-release features you should switch to `next` after this release.
@@ -111,7 +160,7 @@ Some versions need some changes to the server configuration or the pipeline conf
- CI_SOURCE_BRANCH => use CI_COMMIT_SOURCE_BRANCH
- CI_TARGET_BRANCH => use CI_COMMIT_TARGET_BRANCH
- For all available variables and their descriptions have a look at [built-in-environment-variables](./20-usage/50-environment.md#built-in-environment-variables).
+ For all available variables and their descriptions have a look at [built-in-environment-variables](/docs/usage/environment#built-in-environment-variables).
- Prometheus metrics have been changed from `drone_*` to `woodpecker_*`
diff --git a/docs/src/pages/versions.md b/docs/src/pages/versions.md
index 4efe1bcf3..c74291edc 100644
--- a/docs/src/pages/versions.md
+++ b/docs/src/pages/versions.md
@@ -19,7 +19,7 @@ the actual release will be about a week later.
### Deprecations & migrations
-All deprecations and migrations for Woodpecker users and instance admins are documented in the [migration guide](/docs/next/migrations).
+All deprecations and migrations for Woodpecker users and instance admins are documented in the [migration guide](/migrations).
## Next version (current state of the `main` branch)
@@ -33,7 +33,11 @@ Here you can find documentation for previous versions of Woodpecker.
| | | |
| ------- | ---------- | ------------------------------------------------------------------------------------- |
-| 2.6.0 | 2024-07-18 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v2.6.0/docs/docs/) |
+| 2.7.2 | 2024-11-03 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v2.7.2/docs/docs/) |
+| 2.7.1 | 2024-09-07 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v2.7.1/docs/docs/) |
+| 2.7.0 | 2024-07-18 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v2.7.0/docs/docs/) |
+| 2.6.1 | 2024-07-19 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v2.6.1/docs/docs/) |
+| 2.6.0 | 2024-06-13 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v2.6.0/docs/docs/) |
| 2.5.0 | 2024-06-01 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v2.5.0/docs/docs/) |
| 2.4.1 | 2024-03-20 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v2.4.1/docs/docs/) |
| 2.4.0 | 2024-03-19 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v2.4.0/docs/docs/) |
diff --git a/docs/versioned_docs/version-2.5/10-intro.md b/docs/versioned_docs/version-2.5/10-intro.md
index 309c6f1af..e4624e623 100644
--- a/docs/versioned_docs/version-2.5/10-intro.md
+++ b/docs/versioned_docs/version-2.5/10-intro.md
@@ -1,6 +1,6 @@
# Welcome to Woodpecker
-Woodpecker is a simple yet powerful CI/CD engine with great extensibility. It focuses on executing pipelines inside [containers](https://opencontainers.org/).
+Woodpecker is a simple, yet powerful CI/CD engine with great extensibility. It focuses on executing pipelines inside [containers](https://opencontainers.org/).
If you are already using containers in your daily workflow, you'll for sure love Woodpecker.
![woodpecker](woodpecker.png)
diff --git a/docs/versioned_docs/version-2.6/10-intro.md b/docs/versioned_docs/version-2.6/10-intro.md
index 309c6f1af..e4624e623 100644
--- a/docs/versioned_docs/version-2.6/10-intro.md
+++ b/docs/versioned_docs/version-2.6/10-intro.md
@@ -1,6 +1,6 @@
# Welcome to Woodpecker
-Woodpecker is a simple yet powerful CI/CD engine with great extensibility. It focuses on executing pipelines inside [containers](https://opencontainers.org/).
+Woodpecker is a simple, yet powerful CI/CD engine with great extensibility. It focuses on executing pipelines inside [containers](https://opencontainers.org/).
If you are already using containers in your daily workflow, you'll for sure love Woodpecker.
![woodpecker](woodpecker.png)
diff --git a/docs/woodpecker.png b/docs/woodpecker.png
new file mode 100644
index 000000000..93b4d47af
Binary files /dev/null and b/docs/woodpecker.png differ
diff --git a/flake.lock b/flake.lock
index 9eadad2b9..ed36ceded 100644
--- a/flake.lock
+++ b/flake.lock
@@ -5,11 +5,11 @@
"systems": "systems"
},
"locked": {
- "lastModified": 1710146030,
- "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
+ "lastModified": 1726560853,
+ "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
"owner": "numtide",
"repo": "flake-utils",
- "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
+ "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
"type": "github"
},
"original": {
@@ -20,11 +20,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1720542800,
- "narHash": "sha256-ZgnNHuKV6h2+fQ5LuqnUaqZey1Lqqt5dTUAiAnqH0QQ=",
+ "lastModified": 1729665710,
+ "narHash": "sha256-AlcmCXJZPIlO5dmFzV3V2XF6x/OpNWUV8Y/FMPGd8Z4=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "feb2849fdeb70028c70d73b848214b00d324a497",
+ "rev": "2768c7d042a37de65bb1b5b3268fc987e534c49d",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 79068d9aa..188c47524 100644
--- a/flake.nix
+++ b/flake.nix
@@ -34,6 +34,10 @@
go-mockery
protobuf
sqlite
+ go-swag # for generate-swagger
+ addlicense
+ protoc-gen-go
+ protoc-gen-go-grpc
];
CFLAGS = "-I${pkgs.glibc.dev}/include";
LDFLAGS = "-L${pkgs.glibc}/lib";
diff --git a/go.mod b/go.mod
index a9aba768e..ba4bf407e 100644
--- a/go.mod
+++ b/go.mod
@@ -2,78 +2,78 @@ module go.woodpecker-ci.org/woodpecker/v2
go 1.22.0
-toolchain go1.22.5
+toolchain go1.23.2
require (
- al.essio.dev/pkg/shellescape v1.5.0
- code.gitea.io/sdk/gitea v0.18.0
+ al.essio.dev/pkg/shellescape v1.5.1
+ code.gitea.io/sdk/gitea v0.19.0
codeberg.org/6543/go-yaml2json v1.0.0
codeberg.org/6543/xyaml v1.1.0
- codeberg.org/mvdkleijn/forgejo-sdk/forgejo v1.1.1
+ codeberg.org/mvdkleijn/forgejo-sdk/forgejo v1.2.0
github.com/6543/logfile-open v1.2.1
- github.com/adrg/xdg v0.5.0
- github.com/bmatcuk/doublestar/v4 v4.6.1
- github.com/caddyserver/certmagic v0.21.3
+ github.com/adrg/xdg v0.5.2
+ github.com/bmatcuk/doublestar/v4 v4.7.1
+ github.com/caddyserver/certmagic v0.21.4
github.com/cenkalti/backoff/v4 v4.3.0
- github.com/charmbracelet/huh v0.5.1
+ github.com/charmbracelet/huh v0.6.0
github.com/charmbracelet/huh/spinner v0.0.0-20240327025511-ec643317aa10
- github.com/distribution/reference v0.5.0
- github.com/docker/cli v24.0.9+incompatible
- github.com/docker/docker v24.0.9+incompatible
+ github.com/distribution/reference v0.6.0
+ github.com/docker/cli v27.3.1+incompatible
+ github.com/docker/docker v27.3.1+incompatible
github.com/docker/go-connections v0.5.0
github.com/docker/go-units v0.5.0
github.com/drone/envsubst v1.0.3
github.com/expr-lang/expr v1.16.9
github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf
github.com/fsnotify/fsnotify v1.7.0
- github.com/getkin/kin-openapi v0.126.0
+ github.com/gdgvda/cron v0.3.0
+ github.com/getkin/kin-openapi v0.127.0
github.com/gin-gonic/gin v1.10.0
github.com/gitsight/go-vcsurl v1.0.1
- github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf
github.com/go-sql-driver/mysql v1.8.1
github.com/golang-jwt/jwt/v5 v5.2.1
- github.com/google/go-github/v63 v63.0.0
+ github.com/google/go-github/v66 v66.0.0
github.com/google/tink/go v1.7.0
github.com/gorilla/securecookie v1.1.2
github.com/hashicorp/go-hclog v1.6.3
- github.com/hashicorp/go-plugin v1.6.1
- github.com/jellydator/ttlcache/v3 v3.2.0
+ github.com/hashicorp/go-plugin v1.6.2
+ github.com/jellydator/ttlcache/v3 v3.3.0
github.com/joho/godotenv v1.5.1
- github.com/kinbiko/jsonassert v1.1.1
+ github.com/kinbiko/jsonassert v1.2.0
github.com/lib/pq v1.10.9
- github.com/mattn/go-sqlite3 v1.14.22
+ github.com/mattn/go-sqlite3 v1.14.24
github.com/mitchellh/mapstructure v1.5.0
- github.com/moby/moby v24.0.9+incompatible
+ github.com/moby/moby v27.3.1+incompatible
github.com/moby/term v0.5.0
- github.com/muesli/termenv v0.15.2
+ github.com/muesli/termenv v0.15.3-0.20240912151726-82936c5ea257
github.com/neticdk/go-bitbucket v1.0.0
github.com/oklog/ulid/v2 v2.1.0
github.com/pkg/errors v0.9.1
- github.com/prometheus/client_golang v1.19.1
- github.com/robfig/cron v1.2.0
+ github.com/prometheus/client_golang v1.20.5
github.com/rs/zerolog v1.33.0
github.com/stretchr/testify v1.9.0
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
- github.com/swaggo/swag v1.16.3
- github.com/urfave/cli-docs/v3 v3.0.0-alpha5.0.20240714105325-1da00919bcb4
- github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240711030030-937cfe918cb1
- github.com/xanzy/go-gitlab v0.107.0
+ github.com/swaggo/swag v1.16.4
+ github.com/urfave/cli-docs/v3 v3.0.0-alpha5
+ github.com/urfave/cli/v3 v3.0.0-alpha9.0.20241004184838-20ef97b2155a
+ github.com/xanzy/go-gitlab v0.112.0
github.com/xeipuuv/gojsonschema v1.2.0
- github.com/zalando/go-keyring v0.2.5
+ github.com/yaronf/httpsign v0.3.1
+ github.com/zalando/go-keyring v0.2.6
go.uber.org/multierr v1.11.0
- golang.org/x/crypto v0.25.0
- golang.org/x/net v0.27.0
- golang.org/x/oauth2 v0.21.0
- golang.org/x/sync v0.7.0
- golang.org/x/term v0.22.0
- golang.org/x/text v0.16.0
- google.golang.org/grpc v1.65.0
- google.golang.org/protobuf v1.34.2
+ golang.org/x/crypto v0.28.0
+ golang.org/x/net v0.30.0
+ golang.org/x/oauth2 v0.23.0
+ golang.org/x/sync v0.8.0
+ golang.org/x/term v0.25.0
+ golang.org/x/text v0.19.0
+ google.golang.org/grpc v1.67.1
+ google.golang.org/protobuf v1.35.1
gopkg.in/yaml.v3 v3.0.1
- k8s.io/api v0.30.3
- k8s.io/apimachinery v0.30.3
- k8s.io/client-go v0.30.3
+ k8s.io/api v0.31.2
+ k8s.io/apimachinery v0.31.2
+ k8s.io/client-go v0.31.2
src.techknowlogick.com/xormigrate v1.7.1
xorm.io/builder v0.3.13
xorm.io/xorm v1.3.9
@@ -81,10 +81,10 @@ require (
require (
filippo.io/edwards25519 v1.1.0 // indirect
+ github.com/42wim/httpsig v1.2.2 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
- github.com/alessio/shellescape v1.4.1 // indirect
github.com/atotto/clipboard v0.1.4 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
@@ -93,30 +93,33 @@ require (
github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/catppuccin/go v0.2.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
- github.com/charmbracelet/bubbles v0.18.0 // indirect
- github.com/charmbracelet/bubbletea v0.26.4 // indirect
- github.com/charmbracelet/lipgloss v0.11.0 // indirect
- github.com/charmbracelet/x/ansi v0.1.2 // indirect
- github.com/charmbracelet/x/exp/strings v0.0.0-20240617190524-788ec55faed1 // indirect
- github.com/charmbracelet/x/input v0.1.2 // indirect
- github.com/charmbracelet/x/term v0.1.1 // indirect
- github.com/charmbracelet/x/windows v0.1.2 // indirect
+ github.com/charmbracelet/bubbles v0.20.0 // indirect
+ github.com/charmbracelet/bubbletea v1.1.0 // indirect
+ github.com/charmbracelet/lipgloss v0.13.0 // indirect
+ github.com/charmbracelet/x/ansi v0.2.3 // indirect
+ github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 // indirect
+ github.com/charmbracelet/x/term v0.2.0 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect
+ github.com/containerd/log v0.1.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
- github.com/danieljoos/wincred v1.2.0 // indirect
- github.com/davecgh/go-spew v1.1.1 // indirect
+ github.com/danieljoos/wincred v1.2.2 // indirect
+ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
- github.com/docker/distribution v2.8.3+incompatible // indirect
+ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
github.com/docker/docker-credential-helpers v0.8.0 // indirect
+ github.com/dunglas/httpsfv v1.0.2 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
github.com/fatih/color v1.16.0 // indirect
+ github.com/felixge/httpsnoop v1.0.4 // indirect
+ github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-fed/httpsig v1.1.0 // indirect
- github.com/go-logr/logr v1.4.1 // indirect
+ github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.20.4 // indirect
github.com/go-openapi/spec v0.20.13 // indirect
@@ -124,7 +127,7 @@ require (
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.20.0 // indirect
- github.com/goccy/go-json v0.10.2 // indirect
+ github.com/goccy/go-json v0.10.3 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
@@ -143,19 +146,26 @@ require (
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/julienschmidt/httprouter v1.3.0 // indirect
- github.com/klauspost/cpuid/v2 v2.2.7 // indirect
+ github.com/klauspost/compress v1.17.9 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
+ github.com/lestrrat-go/blackmagic v1.0.2 // indirect
+ github.com/lestrrat-go/httpcc v1.0.1 // indirect
+ github.com/lestrrat-go/httprc v1.0.5 // indirect
+ github.com/lestrrat-go/iter v1.0.2 // indirect
+ github.com/lestrrat-go/jwx/v2 v2.1.0 // indirect
+ github.com/lestrrat-go/option v1.0.1 // indirect
github.com/libdns/libdns v0.2.2 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect
- github.com/mattn/go-runewidth v0.0.15 // indirect
- github.com/mholt/acmez/v2 v2.0.1 // indirect
- github.com/miekg/dns v1.1.59 // indirect
- github.com/mitchellh/go-testing-interface v1.0.0 // indirect
+ github.com/mattn/go-runewidth v0.0.16 // indirect
+ github.com/mholt/acmez/v2 v2.0.3 // indirect
+ github.com/miekg/dns v1.1.62 // indirect
github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect
+ github.com/moby/docker-image-spec v1.3.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
@@ -168,35 +178,43 @@ require (
github.com/opencontainers/image-spec v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
- github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/prometheus/client_model v0.5.0 // indirect
- github.com/prometheus/common v0.48.0 // indirect
- github.com/prometheus/procfs v0.12.0 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
+ github.com/prometheus/client_model v0.6.1 // indirect
+ github.com/prometheus/common v0.55.0 // indirect
+ github.com/prometheus/procfs v0.15.1 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
+ github.com/segmentio/asm v1.2.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
+ github.com/x448/float16 v0.8.4 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
- github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
- github.com/zeebo/blake3 v0.2.3 // indirect
+ github.com/zeebo/blake3 v0.2.4 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
+ go.opentelemetry.io/otel v1.28.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect
+ go.opentelemetry.io/otel/metric v1.28.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.28.0 // indirect
+ go.opentelemetry.io/otel/trace v1.28.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/arch v0.8.0 // indirect
- golang.org/x/mod v0.17.0 // indirect
- golang.org/x/sys v0.22.0 // indirect
+ golang.org/x/mod v0.18.0 // indirect
+ golang.org/x/sys v0.26.0 // indirect
golang.org/x/time v0.5.0 // indirect
- golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect
+ golang.org/x/tools v0.22.0 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gotest.tools/v3 v3.4.0 // indirect
- k8s.io/klog/v2 v2.120.1 // indirect
+ k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
- k8s.io/utils v0.0.0-20231127182322-b307cd553661 // indirect
+ k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
diff --git a/go.sum b/go.sum
index f21935450..e9c3764cc 100644
--- a/go.sum
+++ b/go.sum
@@ -1,18 +1,20 @@
-al.essio.dev/pkg/shellescape v1.5.0 h1:7oTvSsQ5kg9WksA9O58y9wjYnY4jP0CL82/Q8WLUGKk=
-al.essio.dev/pkg/shellescape v1.5.0/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
-code.gitea.io/sdk/gitea v0.18.0 h1:+zZrwVmujIrgobt6wVBWCqITz6bn1aBjnCUHmpZrerI=
-code.gitea.io/sdk/gitea v0.18.0/go.mod h1:IG9xZJoltDNeDSW0qiF2Vqx5orMWa7OhVWrjvrd5NpI=
+al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho=
+al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
+code.gitea.io/sdk/gitea v0.19.0 h1:8I6s1s4RHgzxiPHhOQdgim1RWIRcr0LVMbHBjBFXq4Y=
+code.gitea.io/sdk/gitea v0.19.0/go.mod h1:IG9xZJoltDNeDSW0qiF2Vqx5orMWa7OhVWrjvrd5NpI=
codeberg.org/6543/go-yaml2json v1.0.0 h1:heGqo9VEi7gY2yNqjj7X4ADs5nzlFIbGsJtgYDLrnig=
codeberg.org/6543/go-yaml2json v1.0.0/go.mod h1:mz61q14LWF4ZABrgMEDMmk3t9dPi6zgR1uBh2VKV2RQ=
codeberg.org/6543/xyaml v1.1.0 h1:0PWTy8OUqshshjrrnAXFWXSPUEa8R49DIh2ah07SxFc=
codeberg.org/6543/xyaml v1.1.0/go.mod h1:jI7afXLZUxeL4rNNsG1SlHh78L+gma9lK1bIebyFZwA=
-codeberg.org/mvdkleijn/forgejo-sdk/forgejo v1.1.1 h1:WEI3FZdoQjaiaR15TRmyGfY091R7o+NAaso65ckbsq0=
-codeberg.org/mvdkleijn/forgejo-sdk/forgejo v1.1.1/go.mod h1:09wAYX9H0+wBo1baX9DdSqdfreZc6ji5aELsnu9m14M=
+codeberg.org/mvdkleijn/forgejo-sdk/forgejo v1.2.0 h1:/z7iYYHgTuP+BnJY5qnWj6UjlA1YsAFYhi36JZY1S7Y=
+codeberg.org/mvdkleijn/forgejo-sdk/forgejo v1.2.0/go.mod h1:qGzzS6EYParzgmXvnf1QANdnQmHFSyAlJN3SiRZp7e8=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
gitee.com/travelliu/dm v1.8.11192/go.mod h1:DHTzyhCrM843x9VdKVbZ+GKXGRbKM2sJ4LxihRxShkE=
+github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA=
+github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY=
github.com/6543/logfile-open v1.2.1 h1:az+TtNHclTAKaHfFCTSbuduMllANox1gM9qLQr7LV5I=
github.com/6543/logfile-open v1.2.1/go.mod h1:ZoEy7pW2mexmQxiZIqPCeh8vUxVuiHYXmSZNbvEb51g=
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw=
@@ -23,29 +25,31 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg6
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
+github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
+github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
-github.com/adrg/xdg v0.5.0 h1:dDaZvhMXatArP1NPHhnfaQUqWBLBsmx1h1HXQdMoFCY=
-github.com/adrg/xdg v0.5.0/go.mod h1:dDdY4M4DF9Rjy4kHPeNL+ilVF+p2lK8IdM9/rTSGcI4=
-github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0=
-github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=
+github.com/adrg/xdg v0.5.2 h1:HNeVffMIG56GLMaoKTcTcyFhD2xS/dhyuBlKSNCM6Ug=
+github.com/adrg/xdg v0.5.2/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ=
+github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
+github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I=
-github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
+github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q=
+github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA=
github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8=
github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
-github.com/caddyserver/certmagic v0.21.3 h1:pqRRry3yuB4CWBVq9+cUqu+Y6E2z8TswbhNx1AZeYm0=
-github.com/caddyserver/certmagic v0.21.3/go.mod h1:Zq6pklO9nVRl3DIFUw9gVUfXKdpc/0qwTUAQMBlfgtI=
+github.com/caddyserver/certmagic v0.21.4 h1:e7VobB8rffHv8ZZpSiZtEwnLDHUwLVYLWzWSa1FfKI0=
+github.com/caddyserver/certmagic v0.21.4/go.mod h1:swUXjQ1T9ZtMv95qj7/InJvWLXURU85r+CfG0T+ZbDE=
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/catppuccin/go v0.2.0 h1:ktBeIrIP42b/8FGiScP9sgrWOss3lw0Z5SktRoithGA=
@@ -54,28 +58,22 @@ github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK3
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0=
-github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw=
-github.com/charmbracelet/bubbletea v0.26.4 h1:2gDkkzLZaTjMl/dQBpNVtnvcCxsh/FCkimep7FC9c40=
-github.com/charmbracelet/bubbletea v0.26.4/go.mod h1:P+r+RRA5qtI1DOHNFn0otoNwB4rn+zNAzSj/EXz6xU0=
-github.com/charmbracelet/huh v0.5.1 h1:t5j6g9sMjAE2a9AQuc4lNL7pf/0X4WdHiiMGkL8v/aM=
-github.com/charmbracelet/huh v0.5.1/go.mod h1:gs7b2brpzXkY0PBWUqJrlzvOowTCL0vNAR6OTItc+kA=
+github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE=
+github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
+github.com/charmbracelet/bubbletea v1.1.0 h1:FjAl9eAL3HBCHenhz/ZPjkKdScmaS5SK69JAK2YJK9c=
+github.com/charmbracelet/bubbletea v1.1.0/go.mod h1:9Ogk0HrdbHolIKHdjfFpyXJmiCzGwy+FesYkZr7hYU4=
+github.com/charmbracelet/huh v0.6.0 h1:mZM8VvZGuE0hoDXq6XLxRtgfWyTI3b2jZNKh0xWmax8=
+github.com/charmbracelet/huh v0.6.0/go.mod h1:GGNKeWCeNzKpEOh/OJD8WBwTQjV3prFAtQPpLv+AVwU=
github.com/charmbracelet/huh/spinner v0.0.0-20240327025511-ec643317aa10 h1:/HZJSyFVH5rB1MlCDfkhQhRbLPD2Er29ngWXiUQ8bik=
github.com/charmbracelet/huh/spinner v0.0.0-20240327025511-ec643317aa10/go.mod h1:nrBG0YEHaxdbqHXW1xvG1hPqkuac9Eg7RTMvogiXuz0=
-github.com/charmbracelet/lipgloss v0.11.0 h1:UoAcbQ6Qml8hDwSWs0Y1cB5TEQuZkDPH/ZqwWWYTG4g=
-github.com/charmbracelet/lipgloss v0.11.0/go.mod h1:1UdRTH9gYgpcdNN5oBtjbu/IzNKtzVtb7sqN1t9LNn8=
-github.com/charmbracelet/x/ansi v0.1.2 h1:6+LR39uG8DE6zAmbu023YlqjJHkYXDF1z36ZwzO4xZY=
-github.com/charmbracelet/x/ansi v0.1.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
-github.com/charmbracelet/x/exp/strings v0.0.0-20240617190524-788ec55faed1 h1:VZIQzjwFE0EamzG2v8HfemeisB8X02Tl0BZBnJ0PeU8=
-github.com/charmbracelet/x/exp/strings v0.0.0-20240617190524-788ec55faed1/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ=
-github.com/charmbracelet/x/exp/term v0.0.0-20240524151031-ff83003bf67a h1:k/s6UoOSVynWiw7PlclyGO2VdVs5ZLbMIHiGp4shFZE=
-github.com/charmbracelet/x/exp/term v0.0.0-20240524151031-ff83003bf67a/go.mod h1:YBotIGhfoWhHDlnUpJMkjebGV2pdGRCn1Y4/Nk/vVcU=
-github.com/charmbracelet/x/input v0.1.2 h1:QJAZr33eOhDowkkEQ24rsJy4Llxlm+fRDf/cQrmqJa0=
-github.com/charmbracelet/x/input v0.1.2/go.mod h1:LGBim0maUY4Pitjn/4fHnuXb4KirU3DODsyuHuXdOyA=
-github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI=
-github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw=
-github.com/charmbracelet/x/windows v0.1.2 h1:Iumiwq2G+BRmgoayww/qfcvof7W/3uLoelhxojXlRWg=
-github.com/charmbracelet/x/windows v0.1.2/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ=
+github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw=
+github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY=
+github.com/charmbracelet/x/ansi v0.2.3 h1:VfFN0NUpcjBRd4DnKfRaIRo53KRgey/nhOoEqosGDEY=
+github.com/charmbracelet/x/ansi v0.2.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
+github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 h1:qko3AQ4gK1MTS/de7F5hPGx6/k1u0w4TeYmBFwzYVP4=
+github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ=
+github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0=
+github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0=
github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=
github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=
github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@@ -84,6 +82,8 @@ github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJ
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
+github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
@@ -92,24 +92,25 @@ github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
-github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
-github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec=
+github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0=
+github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davidmz/go-pageant v1.0.2 h1:bPblRCh5jGU+Uptpz6LgMZGD5hJoOt7otgT454WvHn0=
github.com/davidmz/go-pageant v1.0.2/go.mod h1:P2EDDnMqIwG5Rrp05dTRITj9z2zpGcD9efWSkTNKLIE=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
github.com/denisenkom/go-mssqldb v0.12.3 h1:pBSGx9Tq67pBOTLmxNuirNTeB8Vjmf886Kx+8Y+8shw=
github.com/denisenkom/go-mssqldb v0.12.3/go.mod h1:k0mtMFOnU+AihqFxPMiF05rtiDrorD1Vrm1KEz5hxDo=
-github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0=
-github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
+github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
+github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
-github.com/docker/cli v24.0.9+incompatible h1:OxbimnP/z+qVjDLpq9wbeFU3Nc30XhSe+LkwYQisD50=
-github.com/docker/cli v24.0.9+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
-github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
-github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0=
-github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/cli v27.3.1+incompatible h1:qEGdFBF3Xu6SCvCYhc7CzaQTlBmqDuzxPDpigSyeKQQ=
+github.com/docker/cli v27.3.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
+github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI=
+github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8=
github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
@@ -118,6 +119,8 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g=
github.com/drone/envsubst v1.0.3/go.mod h1:N2jZmlMufstn1KEqvbHjw40h1KyTmnVzHcSc9bFiJ2g=
+github.com/dunglas/httpsfv v1.0.2 h1:iERDp/YAfnojSDJ7PW3dj1AReJz4MrwbECSSE59JWL0=
+github.com/dunglas/httpsfv v1.0.2/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
@@ -130,15 +133,21 @@ github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf h1:NrF81UtW8gG2LBGkXFQFqlfNnvMt9WdB46sfdJY4oqc=
github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
+github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
-github.com/getkin/kin-openapi v0.126.0 h1:c2cSgLnAsS0xYfKsgt5oBV6MYRM/giU8/RtwUY4wyfY=
-github.com/getkin/kin-openapi v0.126.0/go.mod h1:7mONz8IwmSRg6RttPu6v8U/OJ+gr+J99qSFNjPGSQqw=
+github.com/gdgvda/cron v0.3.0 h1:Wjj9NSYGzvtjkdZxOjpU749OuJGpcqr/tSxzeeBQGVI=
+github.com/gdgvda/cron v0.3.0/go.mod h1:caBF+mzTZGtQqFE05T1m6u9OmCASY3EK51XAICf3wio=
+github.com/getkin/kin-openapi v0.127.0 h1:Mghqi3Dhryf3F8vR370nN67pAERW+3a95vomb3MAREY=
+github.com/getkin/kin-openapi v0.127.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM=
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
@@ -147,14 +156,15 @@ github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/gitsight/go-vcsurl v1.0.1 h1:wkijKsbVg9R2IBP97U7wOANeIW9WJJKkBwS9XqllzWo=
github.com/gitsight/go-vcsurl v1.0.1/go.mod h1:qRFdKDa/0Lh9MT0xE+qQBYZ/01+mY1H40rZUHR24X9U=
-github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf h1:Ab5yBsD/dXhFmgf2hX7T/YYr+VK0Df7SrIxyNztT9YE=
-github.com/go-ap/httpsig v0.0.0-20221203064646-3647b4d88fdf/go.mod h1:+4SUDMvPlRMUPW5PlMTbxj3U5a4fWasBIbakUw7Kp6c=
github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI=
github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
-github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU=
@@ -175,13 +185,14 @@ github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
-github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
+github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
+github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
-github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
+github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
@@ -211,15 +222,16 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/go-github/v63 v63.0.0 h1:13xwK/wk9alSokujB9lJkuzdmQuVn2QCPeck76wR3nE=
-github.com/google/go-github/v63 v63.0.0/go.mod h1:IqbcrgUmIcEaioWrGYei/09o+ge5vhffGOcxrO0AfmA=
+github.com/google/go-github/v66 v66.0.0 h1:ADJsaXj9UotwdgK8/iFZtv7MLc8E8WBl62WLd/D/9+M=
+github.com/google/go-github/v66 v66.0.0/go.mod h1:+4SO9Zkuyf8ytMj0csN1NR/5OTR+MfqPp8P8dVlcvY4=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo=
+github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM=
+github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
@@ -230,12 +242,14 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
-github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI=
-github.com/hashicorp/go-plugin v1.6.1/go.mod h1:XPHFku2tFo3o3QKFgSYo+cghcUhw1NA1hZyMK0PWAw0=
+github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog=
+github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q=
github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU=
github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
@@ -288,8 +302,8 @@ github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0f
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
-github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE=
-github.com/jellydator/ttlcache/v3 v3.2.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4=
+github.com/jellydator/ttlcache/v3 v3.3.0 h1:BdoC9cE81qXfrxeb9eoJi9dWrdhSuwXMAnHTbnBm4Wc=
+github.com/jellydator/ttlcache/v3 v3.3.0/go.mod h1:bj2/e0l4jRnQdrnSTaGTsh4GSXvMjQcy41i7th0GVGw=
github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c=
github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
@@ -303,14 +317,15 @@ github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4d
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
-github.com/kinbiko/jsonassert v1.1.1 h1:DB12divY+YB+cVpHULLuKePSi6+ui4M/shHSzJISkSE=
-github.com/kinbiko/jsonassert v1.1.1/go.mod h1:NO4lzrogohtIdNUNzx8sdzB55M4R4Q1bsrWVdqQ7C+A=
+github.com/kinbiko/jsonassert v1.2.0 h1:+/JthIVXdIrThrOtSN9ry0mNtWKXMWuvxR0nU7gQ+tI=
+github.com/kinbiko/jsonassert v1.2.0/go.mod h1:pCc3uudOt+lVAbkji9O0uw8MSVt4s+1ZJ0y8Ux2F1Og=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
+github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c=
-github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
-github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
+github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -322,8 +337,22 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
+github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k=
+github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU=
+github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE=
+github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E=
+github.com/lestrrat-go/httprc v1.0.5 h1:bsTfiH8xaKOJPrg1R+E3iE/AWZr/x0Phj9PBTG/OLUk=
+github.com/lestrrat-go/httprc v1.0.5/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo=
+github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI=
+github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4=
+github.com/lestrrat-go/jwx/v2 v2.1.0 h1:0zs7Ya6+39qoit7gwAf+cYm1zzgS3fceIdo7RmQ5lkw=
+github.com/lestrrat-go/jwx/v2 v2.1.0/go.mod h1:Xpw9QIaUGiIUD1Wx0NcY1sIHwFf8lDuZn/cmxtXYRys=
+github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU=
+github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -353,24 +382,24 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
-github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
-github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
-github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
-github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
-github.com/mholt/acmez/v2 v2.0.1 h1:3/3N0u1pLjMK4sNEAFSI+bcvzbPhRpY383sy1kLHJ6k=
-github.com/mholt/acmez/v2 v2.0.1/go.mod h1:fX4c9r5jYwMyMsC+7tkYRxHibkOTgta5DIFGoe67e1U=
-github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs=
-github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk=
-github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
+github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+github.com/mholt/acmez/v2 v2.0.3 h1:CgDBlEwg3QBp6s45tPQmFIBrkRIkBT4rW4orMM6p4sw=
+github.com/mholt/acmez/v2 v2.0.3/go.mod h1:pQ1ysaDeGrIMvJ9dfJMk5kJNkn7L2sb3UhyrX6Q91cw=
+github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
+github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4=
github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/moby/moby v24.0.9+incompatible h1:Z/hFbZJqC5Fmuf6jesMLdHU71CMAgdiSJ1ZYey+bFmg=
-github.com/moby/moby v24.0.9+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc=
+github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
+github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
+github.com/moby/moby v27.3.1+incompatible h1:KQbXBjo7PavKpzIl7UkHT31y9lw/e71Uvrqhr4X+zMA=
+github.com/moby/moby v27.3.1+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -387,8 +416,8 @@ github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
-github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
-github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
+github.com/muesli/termenv v0.15.3-0.20240912151726-82936c5ea257 h1:RNw/zu+CJemcRlDFPjElZUbY2UlI/MA2B3I6PM3Isiw=
+github.com/muesli/termenv v0.15.3-0.20240912151726-82936c5ea257/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/neticdk/go-bitbucket v1.0.0 h1:FPvHEgPHoDwD2VHbpyu2R2gnoWQ867RxZd2FivS4wSw=
@@ -400,11 +429,11 @@ github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNs
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY=
-github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM=
+github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
+github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.31.0 h1:54UJxxj6cPInHS3a35wm6BK/F9nHYueZ1NVujHDrnXE=
-github.com/onsi/gomega v1.31.0/go.mod h1:DW9aCi7U6Yi40wNVAvT6kzFnEVEI5n3DloYBiKiT6zk=
+github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
+github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
@@ -418,23 +447,22 @@ github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
-github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
-github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
-github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
-github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=
-github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
-github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
-github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
+github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
+github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
+github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
-github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
-github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
@@ -447,6 +475,10 @@ github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWR
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
+github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
+github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
+github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
@@ -467,6 +499,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
@@ -480,20 +513,22 @@ github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
-github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
-github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
+github.com/swaggo/swag v1.16.4 h1:clWJtd9LStiG3VeijiCfOVODP6VpHtKdQy9ELFG3s1A=
+github.com/swaggo/swag v1.16.4/go.mod h1:VBsHJRsDvfYvqoiMKnsdwhNV9LEMHgEDZcyVYX0sxPg=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
-github.com/urfave/cli-docs/v3 v3.0.0-alpha5.0.20240714105325-1da00919bcb4 h1:exFN/ZOxXslYr9t2AjrniP7wPjp/VLLAJhgazj92EBg=
-github.com/urfave/cli-docs/v3 v3.0.0-alpha5.0.20240714105325-1da00919bcb4/go.mod h1:AIqom6Q60U4tiqHp41i7+/AB2XHgi1WvQ7jOFlccmZ4=
-github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240711030030-937cfe918cb1 h1:oxO/Jem1QPy4lxbDtX8PMiFbL79dNMA6CNAfbC06rn4=
-github.com/urfave/cli/v3 v3.0.0-alpha9.0.20240711030030-937cfe918cb1/go.mod h1:Z1ItyMma7t6I7zHG9OpbExhHQOSkFf/96n+mAZ9MtVI=
-github.com/xanzy/go-gitlab v0.107.0 h1:P2CT9Uy9yN9lJo3FLxpMZ4xj6uWcpnigXsjvqJ6nd2Y=
-github.com/xanzy/go-gitlab v0.107.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY=
+github.com/urfave/cli-docs/v3 v3.0.0-alpha5 h1:H1oWnR2/GN0dNm2PVylws+GxSOD6YOwW/jI5l78YfPk=
+github.com/urfave/cli-docs/v3 v3.0.0-alpha5/go.mod h1:AIqom6Q60U4tiqHp41i7+/AB2XHgi1WvQ7jOFlccmZ4=
+github.com/urfave/cli/v3 v3.0.0-alpha9.0.20241004184838-20ef97b2155a h1:ipFw/N7kumxX+CA9UoKXX86MNfYsfsom8YOdUC+Rsfw=
+github.com/urfave/cli/v3 v3.0.0-alpha9.0.20241004184838-20ef97b2155a/go.mod h1:Z1ItyMma7t6I7zHG9OpbExhHQOSkFf/96n+mAZ9MtVI=
+github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
+github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
+github.com/xanzy/go-gitlab v0.112.0 h1:6Z0cqEooCvBMfBIHw+CgO4AKGRV8na/9781xOb0+DKw=
+github.com/xanzy/go-gitlab v0.112.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
@@ -501,21 +536,37 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
-github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
-github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
+github.com/yaronf/httpsign v0.3.1 h1:A4pqjwOVCwlExyy/mPTTryCHcXn+xhq4+wxq4BKhi2k=
+github.com/yaronf/httpsign v0.3.1/go.mod h1:+7d6GccMcoljvE3QtU00NCmR1iTXCVNfbMe5nqaxRG4=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-github.com/zalando/go-keyring v0.2.5 h1:Bc2HHpjALryKD62ppdEzaFG6VxL6Bc+5v0LYpN8Lba8=
-github.com/zalando/go-keyring v0.2.5/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk=
+github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8ua9s=
+github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI=
github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=
github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
-github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg=
-github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ=
+github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
+github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
+go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
+go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk=
+go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
+go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
+go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
+go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
+go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
+go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
+go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
+go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@@ -550,18 +601,16 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
-golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
-golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
-golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
-golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
+golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
+golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
-golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=
+golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -575,17 +624,17 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
-golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
-golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
-golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
+golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
+golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
+golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
+golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -615,14 +664,14 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
-golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
+golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
-golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
+golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
+golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -630,8 +679,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
-golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
+golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
+golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -648,20 +697,22 @@ golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
-golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
+golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
+golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
-google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
-google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
-google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
-google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8=
+google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
+google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
+google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
+google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
+google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
@@ -686,18 +737,18 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o=
gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-k8s.io/api v0.30.3 h1:ImHwK9DCsPA9uoU3rVh4QHAHHK5dTSv1nxJUapx8hoQ=
-k8s.io/api v0.30.3/go.mod h1:GPc8jlzoe5JG3pb0KJCSLX5oAFIW3/qNJITlDj8BH04=
-k8s.io/apimachinery v0.30.3 h1:q1laaWCmrszyQuSQCfNB8cFgCuDAoPszKY4ucAjDwHc=
-k8s.io/apimachinery v0.30.3/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc=
-k8s.io/client-go v0.30.3 h1:bHrJu3xQZNXIi8/MoxYtZBBWQQXwy16zqJwloXXfD3k=
-k8s.io/client-go v0.30.3/go.mod h1:8d4pf8vYu665/kUbsxWAQ/JDBNWqfFeZnvFiVdmx89U=
-k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw=
-k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
+k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0=
+k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk=
+k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw=
+k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
+k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc=
+k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs=
+k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
+k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag=
k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
-k8s.io/utils v0.0.0-20231127182322-b307cd553661 h1:FepOBzJ0GXm8t0su67ln2wAZjbQ6RxQGZDnzuLcrUTI=
-k8s.io/utils v0.0.0-20231127182322-b307cd553661/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI=
lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
diff --git a/nfpm/agent.yaml b/nfpm/agent.yaml
index 934dc7aab..725bb75da 100644
--- a/nfpm/agent.yaml
+++ b/nfpm/agent.yaml
@@ -10,3 +10,7 @@ section: daemon/system
contents:
- src: ./dist/agent/linux_amd64/woodpecker-agent
dst: /usr/local/bin/woodpecker-agent
+ - src: ./nfpm/woodpecker-agent.service
+ dst: /usr/local/lib/systemd/system/
+ - src: ./nfpm/woodpecker-agent.env.example
+ dst: /etc/woodpecker/
diff --git a/nfpm/server.yaml b/nfpm/server.yaml
index f125da291..2c51167fd 100644
--- a/nfpm/server.yaml
+++ b/nfpm/server.yaml
@@ -10,3 +10,7 @@ section: daemon/system
contents:
- src: ./dist/server/linux_amd64/woodpecker-server
dst: /usr/local/bin/woodpecker-server
+ - src: ./nfpm/woodpecker-server.service
+ dst: /usr/local/lib/systemd/system/
+ - src: ./nfpm/woodpecker-server.env.example
+ dst: /etc/woodpecker/
diff --git a/nfpm/woodpecker-agent.env.example b/nfpm/woodpecker-agent.env.example
new file mode 100644
index 000000000..59c13c968
--- /dev/null
+++ b/nfpm/woodpecker-agent.env.example
@@ -0,0 +1,7 @@
+# Example for a woodpecker-agent.env file
+
+# Check the documentation for the agent:
+# https://woodpecker-ci.org/docs/administration/agent-config
+
+# Add all required environment variables for your setup in the form of VARIABLE=value
+VARIABLE=value
diff --git a/nfpm/woodpecker-agent.service b/nfpm/woodpecker-agent.service
new file mode 100644
index 000000000..20d7db4d7
--- /dev/null
+++ b/nfpm/woodpecker-agent.service
@@ -0,0 +1,19 @@
+[Unit]
+Description=WoodpeckerCI agent
+Documentation=https://woodpecker-ci.org/docs/administration/agent-config
+Requires=network.target
+After=network.target
+ConditionFileNotEmpty=/etc/woodpecker/woodpecker-agent.env
+ConditionPathExists=/etc/woodpecker/woodpecker-agent.env
+
+[Service]
+Type=simple
+EnvironmentFile=/etc/woodpecker/woodpecker-agent.env
+User=woodpecker
+Group=woodpecker
+ExecStart=/usr/local/bin/woodpecker-agent
+WorkingDirectory=/var/lib/woodpecker/
+StateDirectory=woodpecker
+
+[Install]
+WantedBy=multi-user.target
diff --git a/nfpm/woodpecker-server.env.example b/nfpm/woodpecker-server.env.example
new file mode 100644
index 000000000..32418c677
--- /dev/null
+++ b/nfpm/woodpecker-server.env.example
@@ -0,0 +1,7 @@
+# Example for a woodpecker-server.env file
+
+# Check the documentation for the server:
+# https://woodpecker-ci.org/docs/administration/server-config
+
+# Add all required environment variables for your setup in the form of VARIABLE=value
+VARIABLE=value
diff --git a/nfpm/woodpecker-server.service b/nfpm/woodpecker-server.service
new file mode 100644
index 000000000..3968ee5d5
--- /dev/null
+++ b/nfpm/woodpecker-server.service
@@ -0,0 +1,19 @@
+[Unit]
+Description=WoodpeckerCI server
+Documentation=https://woodpecker-ci.org/docs/administration/server-config
+Requires=network.target
+After=network.target
+ConditionFileNotEmpty=/etc/woodpecker/woodpecker-server.env
+ConditionPathExists=/etc/woodpecker/woodpecker-server.env
+
+[Service]
+Type=simple
+EnvironmentFile=/etc/woodpecker/woodpecker-server.env
+User=woodpecker
+Group=woodpecker
+ExecStart=/usr/local/bin/woodpecker-server
+WorkingDirectory=/var/lib/woodpecker/
+StateDirectory=woodpecker
+
+[Install]
+WantedBy=multi-user.target
diff --git a/pipeline/backend/common/script.go b/pipeline/backend/common/script.go
index 5ad13a477..c98a19393 100644
--- a/pipeline/backend/common/script.go
+++ b/pipeline/backend/common/script.go
@@ -22,13 +22,11 @@ func GenerateContainerConf(commands []string, goos string) (env map[string]strin
env = make(map[string]string)
if goos == "windows" {
env["CI_SCRIPT"] = base64.StdEncoding.EncodeToString([]byte(generateScriptWindows(commands)))
- env["HOME"] = "c:\\root"
env["SHELL"] = "powershell.exe"
// cspell:disable-next-line
entry = []string{"powershell", "-noprofile", "-noninteractive", "-command", "[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Env:CI_SCRIPT)) | iex"}
} else {
env["CI_SCRIPT"] = base64.StdEncoding.EncodeToString([]byte(generateScriptPosix(commands)))
- env["HOME"] = "/root"
env["SHELL"] = "/bin/sh"
entry = []string{"/bin/sh", "-c", "echo $CI_SCRIPT | base64 -d | /bin/sh -e"}
}
diff --git a/pipeline/backend/common/script_posix.go b/pipeline/backend/common/script_posix.go
index d22ac78ed..1a0a78bcd 100644
--- a/pipeline/backend/common/script_posix.go
+++ b/pipeline/backend/common/script_posix.go
@@ -53,6 +53,8 @@ fi
unset CI_NETRC_USERNAME
unset CI_NETRC_PASSWORD
unset CI_SCRIPT
+mkdir -p "$CI_WORKSPACE"
+cd "$CI_WORKSPACE"
`
// traceScript is a helper script that is added to the step script
diff --git a/pipeline/backend/common/script_posix_test.go b/pipeline/backend/common/script_posix_test.go
index 497932ed8..ff0dd6e0d 100644
--- a/pipeline/backend/common/script_posix_test.go
+++ b/pipeline/backend/common/script_posix_test.go
@@ -39,6 +39,8 @@ fi
unset CI_NETRC_USERNAME
unset CI_NETRC_PASSWORD
unset CI_SCRIPT
+mkdir -p "$CI_WORKSPACE"
+cd "$CI_WORKSPACE"
echo + 'echo ${PATH}'
echo ${PATH}
diff --git a/pipeline/backend/common/script_test.go b/pipeline/backend/common/script_test.go
index b532f7451..1d3722241 100644
--- a/pipeline/backend/common/script_test.go
+++ b/pipeline/backend/common/script_test.go
@@ -21,19 +21,17 @@ import (
)
const (
- windowsScriptBase64 = "CiRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCc7CiZjbWQgL2MgIm1rZGlyIGM6XHJvb3QiOwppZiAoJEVudjpDSV9ORVRSQ19NQUNISU5FKSB7CiRuZXRyYz1bc3RyaW5nXTo6Rm9ybWF0KCJ7MH1cX25ldHJjIiwkRW52OkhPTUUpOwoibWFjaGluZSAkRW52OkNJX05FVFJDX01BQ0hJTkUiID4+ICRuZXRyYzsKImxvZ2luICRFbnY6Q0lfTkVUUkNfVVNFUk5BTUUiID4+ICRuZXRyYzsKInBhc3N3b3JkICRFbnY6Q0lfTkVUUkNfUEFTU1dPUkQiID4+ICRuZXRyYzsKfTsKW0Vudmlyb25tZW50XTo6U2V0RW52aXJvbm1lbnRWYXJpYWJsZSgiQ0lfTkVUUkNfUEFTU1dPUkQiLCRudWxsKTsKW0Vudmlyb25tZW50XTo6U2V0RW52aXJvbm1lbnRWYXJpYWJsZSgiQ0lfU0NSSVBUIiwkbnVsbCk7CgpXcml0ZS1PdXRwdXQgKCcrICJlY2hvIGhlbGxvIHdvcmxkIicpOwomIGVjaG8gaGVsbG8gd29ybGQ7IGlmICgkTEFTVEVYSVRDT0RFIC1uZSAwKSB7ZXhpdCAkTEFTVEVYSVRDT0RFfQoK"
- posixScriptBase64 = "CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU9GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1JECnVuc2V0IENJX1NDUklQVAoKZWNobyArICdlY2hvIGhlbGxvIHdvcmxkJwplY2hvIGhlbGxvIHdvcmxkCg=="
+ windowsScriptBase64 = "CiRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCc7CmlmIChbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdDSV9XT1JLU1BBQ0UnKSkgeyBpZiAoLW5vdCAoVGVzdC1QYXRoICIkZW52OkNJX1dPUktTUEFDRSIpKSB7IE5ldy1JdGVtIC1QYXRoICIkZW52OkNJX1dPUktTUEFDRSIgLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UgfX07CmlmICgtbm90IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ0hPTUUnKSkgeyBbRW52aXJvbm1lbnRdOjpTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdIT01FJywgJ2M6XHJvb3QnKSB9OwppZiAoLW5vdCAoVGVzdC1QYXRoICIkZW52OkhPTUUiKSkgeyBOZXctSXRlbSAtUGF0aCAiJGVudjpIT01FIiAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Gb3JjZSB9OwppZiAoJEVudjpDSV9ORVRSQ19NQUNISU5FKSB7CiRuZXRyYz1bc3RyaW5nXTo6Rm9ybWF0KCJ7MH1cX25ldHJjIiwkRW52OkhPTUUpOwoibWFjaGluZSAkRW52OkNJX05FVFJDX01BQ0hJTkUiID4+ICRuZXRyYzsKImxvZ2luICRFbnY6Q0lfTkVUUkNfVVNFUk5BTUUiID4+ICRuZXRyYzsKInBhc3N3b3JkICRFbnY6Q0lfTkVUUkNfUEFTU1dPUkQiID4+ICRuZXRyYzsKfTsKW0Vudmlyb25tZW50XTo6U2V0RW52aXJvbm1lbnRWYXJpYWJsZSgiQ0lfTkVUUkNfUEFTU1dPUkQiLCRudWxsKTsKW0Vudmlyb25tZW50XTo6U2V0RW52aXJvbm1lbnRWYXJpYWJsZSgiQ0lfU0NSSVBUIiwkbnVsbCk7CmlmIChbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdDSV9XT1JLU1BBQ0UnKSkgeyBjZCAiJGVudjpDSV9XT1JLU1BBQ0UiIH07CgpXcml0ZS1PdXRwdXQgKCcrICJlY2hvIGhlbGxvIHdvcmxkIicpOwomIGVjaG8gaGVsbG8gd29ybGQ7IGlmICgkTEFTVEVYSVRDT0RFIC1uZSAwKSB7ZXhpdCAkTEFTVEVYSVRDT0RFfQoK"
+ posixScriptBase64 = "CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU9GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1JECnVuc2V0IENJX1NDUklQVApta2RpciAtcCAiJENJX1dPUktTUEFDRSIKY2QgIiRDSV9XT1JLU1BBQ0UiCgplY2hvICsgJ2VjaG8gaGVsbG8gd29ybGQnCmVjaG8gaGVsbG8gd29ybGQK"
)
func TestGenerateContainerConf(t *testing.T) {
gotEnv, gotEntry := GenerateContainerConf([]string{"echo hello world"}, "windows")
assert.Equal(t, windowsScriptBase64, gotEnv["CI_SCRIPT"])
- assert.Equal(t, "c:\\root", gotEnv["HOME"])
assert.Equal(t, "powershell.exe", gotEnv["SHELL"])
assert.Equal(t, []string{"powershell", "-noprofile", "-noninteractive", "-command", "[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($Env:CI_SCRIPT)) | iex"}, gotEntry)
gotEnv, gotEntry = GenerateContainerConf([]string{"echo hello world"}, "linux")
assert.Equal(t, posixScriptBase64, gotEnv["CI_SCRIPT"])
- assert.Equal(t, "/root", gotEnv["HOME"])
assert.Equal(t, "/bin/sh", gotEnv["SHELL"])
assert.Equal(t, []string{"/bin/sh", "-c", "echo $CI_SCRIPT | base64 -d | /bin/sh -e"}, gotEntry)
}
diff --git a/pipeline/backend/common/script_win.go b/pipeline/backend/common/script_win.go
index 17d3b8279..5bf220f9c 100644
--- a/pipeline/backend/common/script_win.go
+++ b/pipeline/backend/common/script_win.go
@@ -40,7 +40,9 @@ func generateScriptWindows(commands []string) string {
const setupScriptWin = `
$ErrorActionPreference = 'Stop';
-&cmd /c "mkdir c:\root";
+if ([Environment]::GetEnvironmentVariable('CI_WORKSPACE')) { if (-not (Test-Path "$env:CI_WORKSPACE")) { New-Item -Path "$env:CI_WORKSPACE" -ItemType Directory -Force }};
+if (-not [Environment]::GetEnvironmentVariable('HOME')) { [Environment]::SetEnvironmentVariable('HOME', 'c:\root') };
+if (-not (Test-Path "$env:HOME")) { New-Item -Path "$env:HOME" -ItemType Directory -Force };
if ($Env:CI_NETRC_MACHINE) {
$netrc=[string]::Format("{0}\_netrc",$Env:HOME);
"machine $Env:CI_NETRC_MACHINE" >> $netrc;
@@ -49,6 +51,7 @@ $netrc=[string]::Format("{0}\_netrc",$Env:HOME);
};
[Environment]::SetEnvironmentVariable("CI_NETRC_PASSWORD",$null);
[Environment]::SetEnvironmentVariable("CI_SCRIPT",$null);
+if ([Environment]::GetEnvironmentVariable('CI_WORKSPACE')) { cd "$env:CI_WORKSPACE" };
%s
`
diff --git a/pipeline/backend/common/script_win_test.go b/pipeline/backend/common/script_win_test.go
index bbd1bfb41..d7755b478 100644
--- a/pipeline/backend/common/script_win_test.go
+++ b/pipeline/backend/common/script_win_test.go
@@ -29,7 +29,9 @@ func TestGenerateScriptWin(t *testing.T) {
from: []string{"echo %PATH%", "go build", "go test"},
want: `
$ErrorActionPreference = 'Stop';
-&cmd /c "mkdir c:\root";
+if ([Environment]::GetEnvironmentVariable('CI_WORKSPACE')) { if (-not (Test-Path "$env:CI_WORKSPACE")) { New-Item -Path "$env:CI_WORKSPACE" -ItemType Directory -Force }};
+if (-not [Environment]::GetEnvironmentVariable('HOME')) { [Environment]::SetEnvironmentVariable('HOME', 'c:\root') };
+if (-not (Test-Path "$env:HOME")) { New-Item -Path "$env:HOME" -ItemType Directory -Force };
if ($Env:CI_NETRC_MACHINE) {
$netrc=[string]::Format("{0}\_netrc",$Env:HOME);
"machine $Env:CI_NETRC_MACHINE" >> $netrc;
@@ -38,6 +40,7 @@ $netrc=[string]::Format("{0}\_netrc",$Env:HOME);
};
[Environment]::SetEnvironmentVariable("CI_NETRC_PASSWORD",$null);
[Environment]::SetEnvironmentVariable("CI_SCRIPT",$null);
+if ([Environment]::GetEnvironmentVariable('CI_WORKSPACE')) { cd "$env:CI_WORKSPACE" };
Write-Output ('+ "echo %PATH%"');
& echo %PATH%; if ($LASTEXITCODE -ne 0) {exit $LASTEXITCODE}
diff --git a/pipeline/backend/docker/config.go b/pipeline/backend/docker/config.go
new file mode 100644
index 000000000..299ce31b8
--- /dev/null
+++ b/pipeline/backend/docker/config.go
@@ -0,0 +1,71 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package docker
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/rs/zerolog/log"
+ "github.com/urfave/cli/v3"
+)
+
+type config struct {
+ enableIPv6 bool
+ network string
+ volumes []string
+ resourceLimit resourceLimit
+}
+
+type resourceLimit struct {
+ MemSwapLimit int64
+ MemLimit int64
+ ShmSize int64
+ CPUQuota int64
+ CPUShares int64
+ CPUSet string
+}
+
+func configFromCli(c *cli.Command) (config, error) {
+ conf := config{
+ enableIPv6: c.Bool("backend-docker-ipv6"),
+ network: c.String("backend-docker-network"),
+ resourceLimit: resourceLimit{
+ MemSwapLimit: c.Int("backend-docker-limit-mem-swap"),
+ MemLimit: c.Int("backend-docker-limit-mem"),
+ ShmSize: c.Int("backend-docker-limit-shm-size"),
+ CPUQuota: c.Int("backend-docker-limit-cpu-quota"),
+ CPUShares: c.Int("backend-docker-limit-cpu-shares"),
+ CPUSet: c.String("backend-docker-limit-cpu-set"),
+ },
+ }
+
+ volumes := strings.Split(c.String("backend-docker-volumes"), ",")
+ conf.volumes = make([]string, 0, len(volumes))
+ // Validate provided volume definitions
+ for _, v := range volumes {
+ if v == "" {
+ continue
+ }
+ parts, err := splitVolumeParts(v)
+ if err != nil {
+ log.Error().Err(err).Msgf("can not parse volume config")
+ return conf, fmt.Errorf("invalid volume '%s' provided in WOODPECKER_BACKEND_DOCKER_VOLUMES: %w", v, err)
+ }
+ conf.volumes = append(conf.volumes, strings.Join(parts, ":"))
+ }
+
+ return conf, nil
+}
diff --git a/pipeline/backend/docker/convert.go b/pipeline/backend/docker/convert.go
index d67672274..c08771f00 100644
--- a/pipeline/backend/docker/convert.go
+++ b/pipeline/backend/docker/convert.go
@@ -68,20 +68,20 @@ func toContainerName(step *types.Step) string {
}
// returns a container host configuration.
-func toHostConfig(step *types.Step) *container.HostConfig {
+func toHostConfig(step *types.Step, conf *config) *container.HostConfig {
config := &container.HostConfig{
Resources: container.Resources{
- CPUQuota: step.CPUQuota,
- CPUShares: step.CPUShares,
- CpusetCpus: step.CPUSet,
- Memory: step.MemLimit,
- MemorySwap: step.MemSwapLimit,
+ CPUQuota: conf.resourceLimit.CPUQuota,
+ CPUShares: conf.resourceLimit.CPUShares,
+ CpusetCpus: conf.resourceLimit.CPUSet,
+ Memory: conf.resourceLimit.MemLimit,
+ MemorySwap: conf.resourceLimit.MemSwapLimit,
},
+ ShmSize: conf.resourceLimit.ShmSize,
LogConfig: container.LogConfig{
Type: "json-file",
},
Privileged: step.Privileged,
- ShmSize: step.ShmSize,
}
if len(step.NetworkMode) != 0 {
diff --git a/pipeline/backend/docker/convert_test.go b/pipeline/backend/docker/convert_test.go
index c353efed5..dbda92341 100644
--- a/pipeline/backend/docker/convert_test.go
+++ b/pipeline/backend/docker/convert_test.go
@@ -19,8 +19,8 @@ import (
"sort"
"testing"
- "github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
+ "github.com/docker/docker/api/types/system"
"github.com/stretchr/testify/assert"
backend "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types"
@@ -111,7 +111,7 @@ var (
}
testEngine = &docker{
- info: types.Info{
+ info: system.Info{
Architecture: "x86_64",
OSType: "linux",
DefaultRuntime: "runc",
@@ -166,7 +166,7 @@ func TestEncodeAuthToBase64(t *testing.T) {
}
func TestToConfigSmall(t *testing.T) {
- engine := docker{info: types.Info{OSType: "linux/riscv64"}}
+ engine := docker{info: system.Info{OSType: "linux/riscv64"}}
conf := engine.toConfig(&backend.Step{
Name: "test",
@@ -185,48 +185,51 @@ func TestToConfigSmall(t *testing.T) {
"wp_uuid": "09238932",
},
Env: []string{
- "CI_SCRIPT=CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW" +
- "5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU9" +
- "GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1JE" +
- "CnVuc2V0IENJX1NDUklQVAoKZWNobyArICdnbyB0ZXN0JwpnbyB0ZXN0Cg==",
- "HOME=/root",
+ "CI_SCRIPT=CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU9GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1JECnVuc2V0IENJX1NDUklQVApta2RpciAtcCAiJENJX1dPUktTUEFDRSIKY2QgIiRDSV9XT1JLU1BBQ0UiCgplY2hvICsgJ2dvIHRlc3QnCmdvIHRlc3QK",
"SHELL=/bin/sh",
},
}, conf)
}
func TestToConfigFull(t *testing.T) {
- engine := docker{info: types.Info{OSType: "linux/riscv64"}}
+ engine := docker{
+ info: system.Info{OSType: "linux/riscv64"},
+ config: config{
+ enableIPv6: true,
+ resourceLimit: resourceLimit{
+ MemSwapLimit: 12,
+ MemLimit: 13,
+ ShmSize: 14,
+ CPUQuota: 15,
+ CPUShares: 16,
+ },
+ },
+ }
conf := engine.toConfig(&backend.Step{
- Name: "test",
- UUID: "09238932",
- Type: backend.StepTypeCommands,
- Image: "golang:1.2.3",
- Pull: true,
- Detached: true,
- Privileged: true,
- WorkingDir: "/src/abc",
- Environment: map[string]string{"TAGS": "sqlite"},
- Commands: []string{"go test", "go vet ./..."},
- ExtraHosts: []backend.HostAlias{{Name: "t", IP: "1.2.3.4"}},
- Volumes: []string{"/cache:/cache"},
- Tmpfs: []string{"/tmp"},
- Devices: []string{"/dev/sdc"},
- Networks: []backend.Conn{{Name: "extra-net", Aliases: []string{"extra.net"}}},
- DNS: []string{"9.9.9.9", "8.8.8.8"},
- DNSSearch: nil,
- MemSwapLimit: 12,
- MemLimit: 13,
- ShmSize: 14,
- CPUQuota: 15,
- CPUShares: 16,
- OnFailure: true,
- OnSuccess: true,
- Failure: "fail",
- AuthConfig: backend.Auth{Username: "user", Password: "123456"},
- NetworkMode: "bridge",
- Ports: []backend.Port{{Number: 21}, {Number: 22}},
+ Name: "test",
+ UUID: "09238932",
+ Type: backend.StepTypeCommands,
+ Image: "golang:1.2.3",
+ Pull: true,
+ Detached: true,
+ Privileged: true,
+ WorkingDir: "/src/abc",
+ Environment: map[string]string{"TAGS": "sqlite"},
+ Commands: []string{"go test", "go vet ./..."},
+ ExtraHosts: []backend.HostAlias{{Name: "t", IP: "1.2.3.4"}},
+ Volumes: []string{"/cache:/cache"},
+ Tmpfs: []string{"/tmp"},
+ Devices: []string{"/dev/sdc"},
+ Networks: []backend.Conn{{Name: "extra-net", Aliases: []string{"extra.net"}}},
+ DNS: []string{"9.9.9.9", "8.8.8.8"},
+ DNSSearch: nil,
+ OnFailure: true,
+ OnSuccess: true,
+ Failure: "fail",
+ AuthConfig: backend.Auth{Username: "user", Password: "123456"},
+ NetworkMode: "bridge",
+ Ports: []backend.Port{{Number: 21}, {Number: 22}},
})
assert.NotNil(t, conf)
@@ -242,12 +245,7 @@ func TestToConfigFull(t *testing.T) {
"wp_uuid": "09238932",
},
Env: []string{
- "CI_SCRIPT=CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW" +
- "5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU" +
- "9GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1" +
- "JECnVuc2V0IENJX1NDUklQVAoKZWNobyArICdnbyB0ZXN0JwpnbyB0ZXN0CgplY2hvICsgJ2dvIHZldCAuLy4uLicKZ28gdmV0IC" +
- "4vLi4uCg==",
- "HOME=/root",
+ "CI_SCRIPT=CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU9GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1JECnVuc2V0IENJX1NDUklQVApta2RpciAtcCAiJENJX1dPUktTUEFDRSIKY2QgIiRDSV9XT1JLU1BBQ0UiCgplY2hvICsgJ2dvIHRlc3QnCmdvIHRlc3QKCmVjaG8gKyAnZ28gdmV0IC4vLi4uJwpnbyB2ZXQgLi8uLi4K",
"SHELL=/bin/sh",
"TAGS=sqlite",
},
diff --git a/pipeline/backend/docker/docker.go b/pipeline/backend/docker/docker.go
index 69ca8480e..bc92b56a3 100644
--- a/pipeline/backend/docker/docker.go
+++ b/pipeline/backend/docker/docker.go
@@ -22,8 +22,10 @@ import (
"path/filepath"
"strings"
- "github.com/docker/docker/api/types"
+ "github.com/docker/docker/api/types/container"
+ "github.com/docker/docker/api/types/image"
"github.com/docker/docker/api/types/network"
+ "github.com/docker/docker/api/types/system"
"github.com/docker/docker/api/types/volume"
tls_config "github.com/docker/go-connections/tlsconfig"
"github.com/moby/moby/client"
@@ -38,11 +40,9 @@ import (
)
type docker struct {
- client client.APIClient
- enableIPv6 bool
- network string
- volumes []string
- info types.Info
+ client client.APIClient
+ info system.Info
+ config config
}
const (
@@ -130,22 +130,9 @@ func (e *docker) Load(ctx context.Context) (*backend.BackendInfo, error) {
return nil, err
}
- e.enableIPv6 = c.Bool("backend-docker-ipv6")
- e.network = c.String("backend-docker-network")
-
- volumes := strings.Split(c.String("backend-docker-volumes"), ",")
- e.volumes = make([]string, 0, len(volumes))
- // Validate provided volume definitions
- for _, v := range volumes {
- if v == "" {
- continue
- }
- parts, err := splitVolumeParts(v)
- if err != nil {
- log.Error().Err(err).Msgf("invalid volume '%s' provided in WOODPECKER_BACKEND_DOCKER_VOLUMES", v)
- continue
- }
- e.volumes = append(e.volumes, strings.Join(parts, ":"))
+ e.config, err = configFromCli(c)
+ if err != nil {
+ return nil, err
}
return &backend.BackendInfo{
@@ -171,9 +158,9 @@ func (e *docker) SetupWorkflow(ctx context.Context, conf *backend.Config, taskUU
networkDriver = networkDriverNAT
}
for _, n := range conf.Networks {
- _, err := e.client.NetworkCreate(ctx, n.Name, types.NetworkCreate{
+ _, err := e.client.NetworkCreate(ctx, n.Name, network.CreateOptions{
Driver: networkDriver,
- EnableIPv6: e.enableIPv6,
+ EnableIPv6: &e.config.enableIPv6,
})
if err != nil {
return err
@@ -186,11 +173,11 @@ func (e *docker) StartStep(ctx context.Context, step *backend.Step, taskUUID str
log.Trace().Str("taskUUID", taskUUID).Msgf("start step %s", step.Name)
config := e.toConfig(step)
- hostConfig := toHostConfig(step)
+ hostConfig := toHostConfig(step, &e.config)
containerName := toContainerName(step)
// create pull options with encoded authorization credentials.
- pullOpts := types.ImagePullOptions{}
+ pullOpts := image.PullOptions{}
if step.AuthConfig.Username != "" && step.AuthConfig.Password != "" {
pullOpts.RegistryAuth, _ = encodeAuthToBase64(step.AuthConfig)
}
@@ -215,7 +202,7 @@ func (e *docker) StartStep(ctx context.Context, step *backend.Step, taskUUID str
}
// add default volumes to the host configuration
- hostConfig.Binds = utils.DeduplicateStrings(append(hostConfig.Binds, e.volumes...))
+ hostConfig.Binds = utils.DeduplicateStrings(append(hostConfig.Binds, e.config.volumes...))
_, err := e.client.ContainerCreate(ctx, config, hostConfig, nil, nil, containerName)
if client.IsErrNotFound(err) {
@@ -249,15 +236,15 @@ func (e *docker) StartStep(ctx context.Context, step *backend.Step, taskUUID str
}
// join the container to an existing network
- if e.network != "" {
- err = e.client.NetworkConnect(ctx, e.network, containerName, &network.EndpointSettings{})
+ if e.config.network != "" {
+ err = e.client.NetworkConnect(ctx, e.config.network, containerName, &network.EndpointSettings{})
if err != nil {
return err
}
}
}
- return e.client.ContainerStart(ctx, containerName, types.ContainerStartOptions{})
+ return e.client.ContainerStart(ctx, containerName, container.StartOptions{})
}
func (e *docker) WaitStep(ctx context.Context, step *backend.Step, taskUUID string) (*backend.State, error) {
@@ -286,7 +273,7 @@ func (e *docker) WaitStep(ctx context.Context, step *backend.Step, taskUUID stri
func (e *docker) TailStep(ctx context.Context, step *backend.Step, taskUUID string) (io.ReadCloser, error) {
log.Trace().Str("taskUUID", taskUUID).Msgf("tail logs of step %s", step.Name)
- logs, err := e.client.ContainerLogs(ctx, toContainerName(step), types.ContainerLogsOptions{
+ logs, err := e.client.ContainerLogs(ctx, toContainerName(step), container.LogsOptions{
Follow: true,
ShowStdout: true,
ShowStderr: true,
@@ -350,7 +337,7 @@ func (e *docker) DestroyWorkflow(ctx context.Context, conf *backend.Config, task
return nil
}
-var removeOpts = types.ContainerRemoveOptions{
+var removeOpts = container.RemoveOptions{
RemoveVolumes: true,
RemoveLinks: false,
Force: false,
diff --git a/pipeline/backend/docker/flags.go b/pipeline/backend/docker/flags.go
index 379cf5996..e1ac036e2 100644
--- a/pipeline/backend/docker/flags.go
+++ b/pipeline/backend/docker/flags.go
@@ -56,4 +56,37 @@ var Flags = []cli.Flag{
Name: "backend-docker-volumes",
Usage: "backend docker volumes (comma separated)",
},
+ //
+ // resource limit parameters
+ //
+ &cli.IntFlag{
+ Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_LIMIT_MEM_SWAP", "WOODPECKER_LIMIT_MEM_SWAP"),
+ Name: "backend-docker-limit-mem-swap",
+ Usage: "maximum memory used for swap in bytes",
+ },
+ &cli.IntFlag{
+ Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_LIMIT_MEM", "WOODPECKER_LIMIT_MEM"),
+ Name: "backend-docker-limit-mem",
+ Usage: "maximum memory allowed in bytes",
+ },
+ &cli.IntFlag{
+ Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_LIMIT_SHM_SIZE", "WOODPECKER_LIMIT_SHM_SIZE"),
+ Name: "backend-docker-limit-shm-size",
+ Usage: "docker /dev/shm allowed in bytes",
+ },
+ &cli.IntFlag{
+ Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_LIMIT_CPU_QUOTA", "WOODPECKER_LIMIT_CPU_QUOTA"),
+ Name: "backend-docker-limit-cpu-quota",
+ Usage: "impose a cpu quota",
+ },
+ &cli.IntFlag{
+ Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_LIMIT_CPU_SHARES", "WOODPECKER_LIMIT_CPU_SHARES"),
+ Name: "backend-docker-limit-cpu-shares",
+ Usage: "change the cpu shares",
+ },
+ &cli.StringFlag{
+ Sources: cli.EnvVars("WOODPECKER_BACKEND_DOCKER_LIMIT_CPU_SET", "WOODPECKER_LIMIT_CPU_SET"),
+ Name: "backend-docker-limit-cpu-set",
+ Usage: "set the cpus allowed to execute containers",
+ },
}
diff --git a/pipeline/backend/kubernetes/flags.go b/pipeline/backend/kubernetes/flags.go
index 8ba9b079c..910f52624 100644
--- a/pipeline/backend/kubernetes/flags.go
+++ b/pipeline/backend/kubernetes/flags.go
@@ -82,7 +82,6 @@ var Flags = []cli.Flag{
Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_PULL_SECRET_NAMES"),
Name: "backend-k8s-pod-image-pull-secret-names",
Usage: "backend k8s pull secret names for private registries",
- Value: []string{"regcred"},
},
&cli.BoolFlag{
Sources: cli.EnvVars("WOODPECKER_BACKEND_K8S_ALLOW_NATIVE_SECRETS"),
diff --git a/pipeline/backend/kubernetes/kubernetes.go b/pipeline/backend/kubernetes/kubernetes.go
index 003656896..ed6f19d06 100644
--- a/pipeline/backend/kubernetes/kubernetes.go
+++ b/pipeline/backend/kubernetes/kubernetes.go
@@ -16,6 +16,7 @@ package kubernetes
import (
"context"
+ std_errs "errors"
"fmt"
"io"
"maps"
@@ -69,6 +70,7 @@ type config struct {
}
type SecurityContextConfig struct {
RunAsNonRoot bool
+ FSGroup *int64
}
func newDefaultDeleteOptions() meta_v1.DeleteOptions {
@@ -97,13 +99,10 @@ func configFromCliContext(ctx context.Context) (*config, error) {
ImagePullSecretNames: c.StringSlice("backend-k8s-pod-image-pull-secret-names"),
SecurityContext: SecurityContextConfig{
RunAsNonRoot: c.Bool("backend-k8s-secctx-nonroot"), // cspell:words secctx nonroot
+ FSGroup: newInt64(defaultFSGroup),
},
NativeSecretsAllowFromStep: c.Bool("backend-k8s-allow-native-secrets"),
}
- // TODO: remove in next major
- if len(config.ImagePullSecretNames) == 1 && config.ImagePullSecretNames[0] == "regcred" {
- log.Warn().Msg("WOODPECKER_BACKEND_K8S_PULL_SECRET_NAMES is set to the default ('regcred'). It will default to empty in Woodpecker 3.0. Set it explicitly before then.")
- }
// Unmarshal label and annotation settings here to ensure they're valid on startup
if labels := c.String("backend-k8s-pod-labels"); labels != "" {
if err := yaml.Unmarshal([]byte(labels), &config.PodLabels); err != nil {
@@ -229,6 +228,13 @@ func (e *kube) StartStep(ctx context.Context, step *types.Step, taskUUID string)
log.Error().Err(err).Msg("could not parse backend options")
}
+ if needsRegistrySecret(step) {
+ err = startRegistrySecret(ctx, e, step)
+ if err != nil {
+ return err
+ }
+ }
+
log.Trace().Str("taskUUID", taskUUID).Msgf("starting step: %s", step.Name)
_, err = startPod(ctx, e, step, options)
return err
@@ -254,7 +260,7 @@ func (e *kube) WaitStep(ctx context.Context, step *types.Step, taskUUID string)
}
if pod.Name == podName {
- if isImagePullBackOffState(pod) {
+ if isImagePullBackOffState(pod) || isInvalidImageName(pod) {
finished <- true
}
@@ -286,7 +292,7 @@ func (e *kube) WaitStep(ctx context.Context, step *types.Step, taskUUID string)
return nil, err
}
- if isImagePullBackOffState(pod) {
+ if isImagePullBackOffState(pod) || isInvalidImageName(pod) {
return nil, fmt.Errorf("could not pull image for pod %s", podName)
}
@@ -330,7 +336,7 @@ func (e *kube) TailStep(ctx context.Context, step *types.Step, taskUUID string)
}
if pod.Name == podName {
- if isImagePullBackOffState(pod) {
+ if isImagePullBackOffState(pod) || isInvalidImageName(pod) {
up <- true
}
switch pod.Status.Phase {
@@ -386,9 +392,20 @@ func (e *kube) TailStep(ctx context.Context, step *types.Step, taskUUID string)
}
func (e *kube) DestroyStep(ctx context.Context, step *types.Step, taskUUID string) error {
+ var errs []error
log.Trace().Str("taskUUID", taskUUID).Msgf("Stopping step: %s", step.Name)
+ if needsRegistrySecret(step) {
+ err := stopRegistrySecret(ctx, e, step, defaultDeleteOptions)
+ if err != nil {
+ errs = append(errs, err)
+ }
+ }
+
err := stopPod(ctx, e, step, defaultDeleteOptions)
- return err
+ if err != nil {
+ errs = append(errs, err)
+ }
+ return std_errs.Join(errs...)
}
// DestroyWorkflow destroys the pipeline environment.
diff --git a/pipeline/backend/kubernetes/pod.go b/pipeline/backend/kubernetes/pod.go
index 679543470..3420ef3b5 100644
--- a/pipeline/backend/kubernetes/pod.go
+++ b/pipeline/backend/kubernetes/pod.go
@@ -31,8 +31,9 @@ import (
)
const (
- StepLabel = "step"
- podPrefix = "wp-"
+ StepLabel = "step"
+ podPrefix = "wp-"
+ defaultFSGroup int64 = 1000
)
func mkPod(step *types.Step, config *config, podName, goos string, options BackendOptions) (*v1.Pod, error) {
@@ -84,7 +85,7 @@ func podMeta(step *types.Step, config *config, options BackendOptions, podName s
meta := meta_v1.ObjectMeta{
Name: podName,
Namespace: config.Namespace,
- Annotations: podAnnotations(config, options, podName),
+ Annotations: podAnnotations(config, options),
}
meta.Labels, err = podLabels(step, config, options)
@@ -126,7 +127,7 @@ func stepLabel(step *types.Step) (string, error) {
return toDNSName(step.Name)
}
-func podAnnotations(config *config, options BackendOptions, podName string) map[string]string {
+func podAnnotations(config *config, options BackendOptions) map[string]string {
annotations := make(map[string]string)
if len(options.Annotations) > 0 {
@@ -141,13 +142,6 @@ func podAnnotations(config *config, options BackendOptions, podName string) map[
log.Trace().Msgf("using annotations from the configuration: %v", config.PodAnnotations)
maps.Copy(annotations, config.PodAnnotations)
}
- securityContext := options.SecurityContext
- if securityContext != nil {
- key, value := apparmorAnnotation(podName, securityContext.ApparmorProfile)
- if key != nil && value != nil {
- annotations[*key] = *value
- }
- }
return annotations
}
@@ -170,6 +164,14 @@ func podSpec(step *types.Step, config *config, options BackendOptions, nsp nativ
log.Trace().Msgf("using the image pull secrets: %v", config.ImagePullSecretNames)
spec.ImagePullSecrets = secretsReferences(config.ImagePullSecretNames)
+ if needsRegistrySecret(step) {
+ log.Trace().Msgf("using an image pull secret from registries")
+ name, err := registrySecretName(step)
+ if err != nil {
+ return spec, err
+ }
+ spec.ImagePullSecrets = append(spec.ImagePullSecrets, secretReference(name))
+ }
spec.Volumes = append(spec.Volumes, nsp.volumes...)
@@ -181,7 +183,7 @@ func podContainer(step *types.Step, podName, goos string, options BackendOptions
container := v1.Container{
Name: podName,
Image: step.Image,
- WorkingDir: step.WorkingDir,
+ WorkingDir: step.WorkspaceBase,
Ports: containerPorts(step.Ports),
SecurityContext: containerSecurityContext(options.SecurityContext, step.Privileged),
}
@@ -377,16 +379,20 @@ func toleration(backendToleration Toleration) v1.Toleration {
func podSecurityContext(sc *SecurityContext, secCtxConf SecurityContextConfig, stepPrivileged bool) *v1.PodSecurityContext {
var (
- nonRoot *bool
- user *int64
- group *int64
- fsGroup *int64
- seccomp *v1.SeccompProfile
+ nonRoot *bool
+ user *int64
+ group *int64
+ fsGroup *int64
+ seccomp *v1.SeccompProfile
+ apparmor *v1.AppArmorProfile
)
if secCtxConf.RunAsNonRoot {
nonRoot = newBool(true)
}
+ if secCtxConf.FSGroup != nil {
+ fsGroup = secCtxConf.FSGroup
+ }
if sc != nil {
// only allow to set user if its not root or step is privileged
@@ -404,12 +410,18 @@ func podSecurityContext(sc *SecurityContext, secCtxConf SecurityContextConfig, s
fsGroup = sc.FSGroup
}
+ // if unset, set fsGroup to 1000 by default to support non-root images
+ if sc.FSGroup != nil {
+ fsGroup = sc.FSGroup
+ }
+
// only allow to set nonRoot if it's not set globally already
if nonRoot == nil && sc.RunAsNonRoot != nil {
nonRoot = sc.RunAsNonRoot
}
seccomp = seccompProfile(sc.SeccompProfile)
+ apparmor = apparmorProfile(sc.ApparmorProfile)
}
if nonRoot == nil && user == nil && group == nil && fsGroup == nil && seccomp == nil {
@@ -417,11 +429,12 @@ func podSecurityContext(sc *SecurityContext, secCtxConf SecurityContextConfig, s
}
securityContext := &v1.PodSecurityContext{
- RunAsNonRoot: nonRoot,
- RunAsUser: user,
- RunAsGroup: group,
- FSGroup: fsGroup,
- SeccompProfile: seccomp,
+ RunAsNonRoot: nonRoot,
+ RunAsUser: user,
+ RunAsGroup: group,
+ FSGroup: fsGroup,
+ SeccompProfile: seccomp,
+ AppArmorProfile: apparmor,
}
log.Trace().Msgf("pod security context that will be used: %v", securityContext)
return securityContext
@@ -443,6 +456,22 @@ func seccompProfile(scp *SecProfile) *v1.SeccompProfile {
return seccompProfile
}
+func apparmorProfile(scp *SecProfile) *v1.AppArmorProfile {
+ if scp == nil || len(scp.Type) == 0 {
+ return nil
+ }
+ log.Trace().Msgf("using AppArmor profile: %v", scp)
+
+ apparmorProfile := &v1.AppArmorProfile{
+ Type: v1.AppArmorProfileType(scp.Type),
+ }
+ if len(scp.LocalhostProfile) > 0 {
+ apparmorProfile.LocalhostProfile = &scp.LocalhostProfile
+ }
+
+ return apparmorProfile
+}
+
func containerSecurityContext(sc *SecurityContext, stepPrivileged bool) *v1.SecurityContext {
if !stepPrivileged {
return nil
@@ -471,36 +500,6 @@ func containerSecurityContext(sc *SecurityContext, stepPrivileged bool) *v1.Secu
return nil
}
-func apparmorAnnotation(containerName string, scp *SecProfile) (*string, *string) {
- if scp == nil {
- return nil, nil
- }
- log.Trace().Msgf("using AppArmor profile: %v", scp)
-
- var (
- profileType string
- profilePath string
- )
-
- if scp.Type == SecProfileTypeRuntimeDefault {
- profileType = "runtime"
- profilePath = "default"
- }
-
- if scp.Type == SecProfileTypeLocalhost {
- profileType = "localhost"
- profilePath = scp.LocalhostProfile
- }
-
- if len(profileType) == 0 {
- return nil, nil
- }
-
- key := v1.DeprecatedAppArmorBetaContainerAnnotationKeyPrefix + containerName
- value := profileType + "/" + profilePath
- return &key, &value
-}
-
func mapToEnvVars(m map[string]string) []v1.EnvVar {
var ev []v1.EnvVar
for k, v := range m {
@@ -532,6 +531,7 @@ func stopPod(ctx context.Context, engine *kube, step *types.Step, deleteOpts met
if err != nil {
return err
}
+
log.Trace().Str("name", podName).Msg("deleting pod")
err = engine.client.CoreV1().Pods(engine.config.Namespace).Delete(ctx, podName, deleteOpts)
diff --git a/pipeline/backend/kubernetes/pod_test.go b/pipeline/backend/kubernetes/pod_test.go
index 8b8241545..821571fdf 100644
--- a/pipeline/backend/kubernetes/pod_test.go
+++ b/pipeline/backend/kubernetes/pod_test.go
@@ -65,7 +65,7 @@ func TestStepLabel(t *testing.T) {
}
func TestTinyPod(t *testing.T) {
- expected := `
+ const expected = `
{
"metadata": {
"name": "wp-01he8bebctabr3kgk0qj36d2me-0",
@@ -93,24 +93,19 @@ func TestTinyPod(t *testing.T) {
"-c",
"echo $CI_SCRIPT | base64 -d | /bin/sh -e"
],
- "workingDir": "/woodpecker/src",
"env": [
"<>",
{
"name": "CI",
"value": "woodpecker"
},
- {
- "name": "HOME",
- "value": "/root"
- },
{
"name": "SHELL",
"value": "/bin/sh"
},
{
"name": "CI_SCRIPT",
- "value": "CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU9GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1JECnVuc2V0IENJX1NDUklQVAoKZWNobyArICdncmFkbGUgYnVpbGQnCmdyYWRsZSBidWlsZAo="
+ "value": "CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU9GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1JECnVuc2V0IENJX1NDUklQVApta2RpciAtcCAiJENJX1dPUktTUEFDRSIKY2QgIiRDSV9XT1JLU1BBQ0UiCgplY2hvICsgJ2dyYWRsZSBidWlsZCcKZ3JhZGxlIGJ1aWxkCg=="
}
],
"resources": {},
@@ -149,7 +144,7 @@ func TestTinyPod(t *testing.T) {
}
func TestFullPod(t *testing.T) {
- expected := `
+ const expected = `
{
"metadata": {
"name": "wp-01he8bebctabr3kgk0qj36d2me-0",
@@ -162,7 +157,6 @@ func TestFullPod(t *testing.T) {
},
"annotations": {
"apps.kubernetes.io/pod-index": "0",
- "container.apparmor.security.beta.kubernetes.io/wp-01he8bebctabr3kgk0qj36d2me-0": "localhost/k8s-apparmor-example-deny-write",
"kubernetes.io/limit-ranger": "LimitRanger plugin set: cpu, memory request and limit for container"
}
},
@@ -183,7 +177,6 @@ func TestFullPod(t *testing.T) {
"/bin/sh",
"-c"
],
- "workingDir": "/woodpecker/src",
"ports": [
{
"containerPort": 1234
@@ -205,11 +198,7 @@ func TestFullPod(t *testing.T) {
},
{
"name": "CI_SCRIPT",
- "value": "CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU9GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1JECnVuc2V0IENJX1NDUklQVAoKZWNobyArICdnbyBnZXQnCmdvIGdldAoKZWNobyArICdnbyB0ZXN0JwpnbyB0ZXN0Cg=="
- },
- {
- "name": "HOME",
- "value": "/root"
+ "value": "CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuCmNhdCA8PEVPRiA+ICRIT01FLy5uZXRyYwptYWNoaW5lICRDSV9ORVRSQ19NQUNISU5FCmxvZ2luICRDSV9ORVRSQ19VU0VSTkFNRQpwYXNzd29yZCAkQ0lfTkVUUkNfUEFTU1dPUkQKRU9GCmNobW9kIDA2MDAgJEhPTUUvLm5ldHJjCmZpCnVuc2V0IENJX05FVFJDX1VTRVJOQU1FCnVuc2V0IENJX05FVFJDX1BBU1NXT1JECnVuc2V0IENJX1NDUklQVApta2RpciAtcCAiJENJX1dPUktTUEFDRSIKY2QgIiRDSV9XT1JLU1BBQ0UiCgplY2hvICsgJ2dvIGdldCcKZ28gZ2V0CgplY2hvICsgJ2dvIHRlc3QnCmdvIHRlc3QK"
},
{
"name": "SHELL",
@@ -250,9 +239,13 @@ func TestFullPod(t *testing.T) {
"runAsGroup": 101,
"runAsNonRoot": true,
"fsGroup": 101,
+ "appArmorProfile": {
+ "type": "Localhost",
+ "localhostProfile": "k8s-apparmor-example-deny-write"
+ },
"seccompProfile": {
- "type": "Localhost",
- "localhostProfile": "profiles/audit.json"
+ "type": "Localhost",
+ "localhostProfile": "profiles/audit.json"
}
},
"imagePullSecrets": [
@@ -261,6 +254,9 @@ func TestFullPod(t *testing.T) {
},
{
"name": "another-pull-secret"
+ },
+ {
+ "name": "wp-01he8bebctabr3kgk0qj36d2me-0"
}
],
"tolerations": [
@@ -314,6 +310,7 @@ func TestFullPod(t *testing.T) {
},
}
pod, err := mkPod(&types.Step{
+ UUID: "01he8bebctabr3kgk0qj36d2me-0",
Name: "go-test",
Image: "meltwater/drone-cache",
WorkingDir: "/woodpecker/src",
@@ -325,6 +322,10 @@ func TestFullPod(t *testing.T) {
Environment: map[string]string{"CGO": "0"},
ExtraHosts: hostAliases,
Ports: ports,
+ AuthConfig: types.Auth{
+ Username: "foo",
+ Password: "bar",
+ },
}, &config{
Namespace: "woodpecker",
ImagePullSecretNames: []string{"regcred", "another-pull-secret"},
@@ -390,7 +391,20 @@ func TestPodPrivilege(t *testing.T) {
}
pod, err = createTestPod(false, false, secCtx)
assert.NoError(t, err)
- assert.Nil(t, pod.Spec.SecurityContext)
+ assert.Equal(t, &v1.PodSecurityContext{
+ SELinuxOptions: (*v1.SELinuxOptions)(nil),
+ WindowsOptions: (*v1.WindowsSecurityContextOptions)(nil),
+ RunAsUser: (*int64)(nil),
+ RunAsGroup: (*int64)(nil),
+ RunAsNonRoot: (*bool)(nil),
+ SupplementalGroups: []int64(nil),
+ SupplementalGroupsPolicy: (*v1.SupplementalGroupsPolicy)(nil),
+ FSGroup: newInt64(0),
+ Sysctls: []v1.Sysctl(nil),
+ FSGroupChangePolicy: (*v1.PodFSGroupChangePolicy)(nil),
+ SeccompProfile: (*v1.SeccompProfile)(nil),
+ AppArmorProfile: (*v1.AppArmorProfile)(nil),
+ }, pod.Spec.SecurityContext)
assert.Nil(t, pod.Spec.Containers[0].SecurityContext)
// step is not privileged, but security context is requesting privileged
@@ -400,7 +414,7 @@ func TestPodPrivilege(t *testing.T) {
pod, err = createTestPod(false, false, secCtx)
assert.NoError(t, err)
assert.Nil(t, pod.Spec.SecurityContext)
- assert.Nil(t, pod.Spec.Containers[0].SecurityContext)
+ assert.Equal(t, (*v1.PodSecurityContext)(nil), pod.Spec.SecurityContext)
// step is privileged and security context is requesting privileged
secCtx = SecurityContext{
@@ -426,7 +440,7 @@ func TestPodPrivilege(t *testing.T) {
}
func TestScratchPod(t *testing.T) {
- expected := `
+ const expected = `
{
"metadata": {
"name": "wp-01he8bebctabr3kgk0qj36d2me-0",
@@ -471,7 +485,7 @@ func TestScratchPod(t *testing.T) {
}
func TestSecrets(t *testing.T) {
- expected := `
+ const expected = `
{
"metadata": {
"name": "wp-3kgk0qj36d2me01he8bebctabr-0",
diff --git a/pipeline/backend/kubernetes/secrets.go b/pipeline/backend/kubernetes/secrets.go
index 47fb401da..96ef84593 100644
--- a/pipeline/backend/kubernetes/secrets.go
+++ b/pipeline/backend/kubernetes/secrets.go
@@ -15,11 +15,21 @@
package kubernetes
import (
+ "context"
+ "encoding/json"
"fmt"
"strings"
+ "github.com/distribution/reference"
+ config_file "github.com/docker/cli/cli/config/configfile"
+ config_file_types "github.com/docker/cli/cli/config/types"
"github.com/rs/zerolog/log"
v1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/errors"
+ meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types"
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/utils"
)
type nativeSecretsProcessor struct {
@@ -189,3 +199,96 @@ func secretReference(name string) v1.LocalObjectReference {
Name: name,
}
}
+
+func needsRegistrySecret(step *types.Step) bool {
+ return step.AuthConfig.Username != "" && step.AuthConfig.Password != ""
+}
+
+func mkRegistrySecret(step *types.Step, config *config) (*v1.Secret, error) {
+ name, err := registrySecretName(step)
+ if err != nil {
+ return nil, err
+ }
+
+ labels, err := registrySecretLabels(step)
+ if err != nil {
+ return nil, err
+ }
+
+ named, err := utils.ParseNamed(step.Image)
+ if err != nil {
+ return nil, err
+ }
+
+ authConfig := config_file.ConfigFile{
+ AuthConfigs: map[string]config_file_types.AuthConfig{
+ reference.Domain(named): {
+ Username: step.AuthConfig.Username,
+ Password: step.AuthConfig.Password,
+ },
+ },
+ }
+
+ configFileJSON, err := json.Marshal(authConfig)
+ if err != nil {
+ return nil, err
+ }
+
+ return &v1.Secret{
+ ObjectMeta: meta_v1.ObjectMeta{
+ Namespace: config.Namespace,
+ Name: name,
+ Labels: labels,
+ },
+ Type: v1.SecretTypeDockerConfigJson,
+ Data: map[string][]byte{
+ v1.DockerConfigJsonKey: configFileJSON,
+ },
+ }, nil
+}
+
+func registrySecretName(step *types.Step) (string, error) {
+ return podName(step)
+}
+
+func registrySecretLabels(step *types.Step) (map[string]string, error) {
+ var err error
+ labels := make(map[string]string)
+
+ if step.Type == types.StepTypeService {
+ labels[ServiceLabel], _ = serviceName(step)
+ }
+ labels[StepLabel], err = stepLabel(step)
+ if err != nil {
+ return labels, err
+ }
+
+ return labels, nil
+}
+
+func startRegistrySecret(ctx context.Context, engine *kube, step *types.Step) error {
+ secret, err := mkRegistrySecret(step, engine.config)
+ if err != nil {
+ return err
+ }
+ log.Trace().Msgf("creating secret: %s", secret.Name)
+ _, err = engine.client.CoreV1().Secrets(engine.config.Namespace).Create(ctx, secret, meta_v1.CreateOptions{})
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func stopRegistrySecret(ctx context.Context, engine *kube, step *types.Step, deleteOpts meta_v1.DeleteOptions) error {
+ name, err := registrySecretName(step)
+ if err != nil {
+ return err
+ }
+ log.Trace().Str("name", name).Msg("deleting secret")
+
+ err = engine.client.CoreV1().Secrets(engine.config.Namespace).Delete(ctx, name, deleteOpts)
+ if errors.IsNotFound(err) {
+ return nil
+ }
+ return err
+}
diff --git a/pipeline/backend/kubernetes/secrets_test.go b/pipeline/backend/kubernetes/secrets_test.go
index fe0c76097..99d06723b 100644
--- a/pipeline/backend/kubernetes/secrets_test.go
+++ b/pipeline/backend/kubernetes/secrets_test.go
@@ -15,10 +15,14 @@
package kubernetes
import (
+ "encoding/json"
"testing"
+ "github.com/kinbiko/jsonassert"
"github.com/stretchr/testify/assert"
v1 "k8s.io/api/core/v1"
+
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline/backend/types"
)
func TestNativeSecretsEnabled(t *testing.T) {
@@ -178,3 +182,61 @@ func TestFileSecret(t *testing.T) {
},
}, nsp.mounts)
}
+
+func TestNoAuthNoSecret(t *testing.T) {
+ assert.False(t, needsRegistrySecret(&types.Step{}))
+}
+
+func TestNoPasswordNoSecret(t *testing.T) {
+ assert.False(t, needsRegistrySecret(&types.Step{
+ AuthConfig: types.Auth{Username: "foo"},
+ }))
+}
+
+func TestNoUsernameNoSecret(t *testing.T) {
+ assert.False(t, needsRegistrySecret(&types.Step{
+ AuthConfig: types.Auth{Password: "foo"},
+ }))
+}
+
+func TestUsernameAndPasswordNeedsSecret(t *testing.T) {
+ assert.True(t, needsRegistrySecret(&types.Step{
+ AuthConfig: types.Auth{Username: "foo", Password: "bar"},
+ }))
+}
+
+func TestRegistrySecret(t *testing.T) {
+ const expected = `{
+ "metadata": {
+ "name": "wp-01he8bebctabr3kgk0qj36d2me-0",
+ "namespace": "woodpecker",
+ "creationTimestamp": null,
+ "labels": {
+ "step": "go-test"
+ }
+ },
+ "type": "kubernetes.io/dockerconfigjson",
+ "data": {
+ ".dockerconfigjson": "eyJhdXRocyI6eyJkb2NrZXIuaW8iOnsidXNlcm5hbWUiOiJmb28iLCJwYXNzd29yZCI6ImJhciJ9fX0="
+ }
+ }`
+
+ secret, err := mkRegistrySecret(&types.Step{
+ UUID: "01he8bebctabr3kgk0qj36d2me-0",
+ Name: "go-test",
+ Image: "meltwater/drone-cache",
+ AuthConfig: types.Auth{
+ Username: "foo",
+ Password: "bar",
+ },
+ }, &config{
+ Namespace: "woodpecker",
+ })
+ assert.NoError(t, err)
+
+ secretJSON, err := json.Marshal(secret)
+ assert.NoError(t, err)
+
+ ja := jsonassert.New(t)
+ ja.Assertf(string(secretJSON), expected)
+}
diff --git a/pipeline/backend/kubernetes/utils.go b/pipeline/backend/kubernetes/utils.go
index 1393c423b..ec601bccc 100644
--- a/pipeline/backend/kubernetes/utils.go
+++ b/pipeline/backend/kubernetes/utils.go
@@ -65,6 +65,18 @@ func isImagePullBackOffState(pod *v1.Pod) bool {
return false
}
+func isInvalidImageName(pod *v1.Pod) bool {
+ for _, containerState := range pod.Status.ContainerStatuses {
+ if containerState.State.Waiting != nil {
+ if containerState.State.Waiting.Reason == "InvalidImageName" {
+ return true
+ }
+ }
+ }
+
+ return false
+}
+
// getClientOutOfCluster returns a k8s client set to the request from outside of cluster.
func getClientOutOfCluster() (kubernetes.Interface, error) {
kubeConfigPath := os.Getenv("KUBECONFIG") // cspell:words KUBECONFIG
diff --git a/pipeline/backend/local/local.go b/pipeline/backend/local/local.go
index 3ea42ba0f..5e11f68f0 100644
--- a/pipeline/backend/local/local.go
+++ b/pipeline/backend/local/local.go
@@ -62,8 +62,14 @@ func (e *local) Name() string {
return "local"
}
-func (e *local) IsAvailable(context.Context) bool {
- return true
+func (e *local) IsAvailable(ctx context.Context) bool {
+ if c, ok := ctx.Value(types.CliCommand).(*cli.Command); ok {
+ if c.String("backend-engine") == e.Name() {
+ return true
+ }
+ }
+ _, inContainer := os.LookupEnv("WOODPECKER_IN_CONTAINER")
+ return !inContainer
}
func (e *local) Flags() []cli.Flag {
diff --git a/pipeline/backend/types/step.go b/pipeline/backend/types/step.go
index 6eb3471b9..2f86be172 100644
--- a/pipeline/backend/types/step.go
+++ b/pipeline/backend/types/step.go
@@ -24,6 +24,7 @@ type Step struct {
Detached bool `json:"detach,omitempty"`
Privileged bool `json:"privileged,omitempty"`
WorkingDir string `json:"working_dir,omitempty"`
+ WorkspaceBase string `json:"workspace_base,omitempty"`
Environment map[string]string `json:"environment,omitempty"`
Entrypoint []string `json:"entrypoint,omitempty"`
Commands []string `json:"commands,omitempty"`
@@ -34,12 +35,6 @@ type Step struct {
Networks []Conn `json:"networks,omitempty"`
DNS []string `json:"dns,omitempty"`
DNSSearch []string `json:"dns_search,omitempty"`
- MemSwapLimit int64 `json:"memswap_limit,omitempty"`
- MemLimit int64 `json:"mem_limit,omitempty"`
- ShmSize int64 `json:"shm_size,omitempty"`
- CPUQuota int64 `json:"cpu_quota,omitempty"`
- CPUShares int64 `json:"cpu_shares,omitempty"`
- CPUSet string `json:"cpu_set,omitempty"`
OnFailure bool `json:"on_failure,omitempty"`
OnSuccess bool `json:"on_success,omitempty"`
Failure string `json:"failure,omitempty"`
diff --git a/pipeline/const.go b/pipeline/const.go
index a4bec9789..473e961ab 100644
--- a/pipeline/const.go
+++ b/pipeline/const.go
@@ -14,4 +14,10 @@
package pipeline
-const ExitCodeKilled int = 137
+const (
+ ExitCodeKilled int = 137
+
+ // Store no more than 1mb in a log-line as 4mb is the limit of a grpc message
+ // and log-lines needs to be parsed by the browsers later on.
+ MaxLogLineLength int = 1 * 1024 * 1024 // 1mb
+)
diff --git a/pipeline/frontend/metadata/drone_compatibility.go b/pipeline/frontend/metadata/drone_compatibility.go
index dfa796f9b..c6de5510d 100644
--- a/pipeline/frontend/metadata/drone_compatibility.go
+++ b/pipeline/frontend/metadata/drone_compatibility.go
@@ -28,18 +28,16 @@ func SetDroneEnviron(env map[string]string) {
copyEnv("CI_PIPELINE_NUMBER", "DRONE_BUILD_NUMBER", env)
copyEnv("CI_PIPELINE_PARENT", "DRONE_BUILD_PARENT", env)
copyEnv("CI_PIPELINE_EVENT", "DRONE_BUILD_EVENT", env)
- copyEnv("CI_PIPELINE_STATUS", "DRONE_BUILD_STATUS", env)
copyEnv("CI_PIPELINE_URL", "DRONE_BUILD_LINK", env)
copyEnv("CI_PIPELINE_CREATED", "DRONE_BUILD_CREATED", env)
copyEnv("CI_PIPELINE_STARTED", "DRONE_BUILD_STARTED", env)
- copyEnv("CI_PIPELINE_FINISHED", "DRONE_BUILD_FINISHED", env)
// commit
copyEnv("CI_COMMIT_SHA", "DRONE_COMMIT", env)
copyEnv("CI_COMMIT_SHA", "DRONE_COMMIT_SHA", env)
copyEnv("CI_PREV_COMMIT_SHA", "DRONE_COMMIT_BEFORE", env)
copyEnv("CI_COMMIT_REF", "DRONE_COMMIT_REF", env)
copyEnv("CI_COMMIT_BRANCH", "DRONE_COMMIT_BRANCH", env)
- copyEnv("CI_COMMIT_URL", "DRONE_COMMIT_LINK", env)
+ copyEnv("CI_PIPELINE_FORGE_URL", "DRONE_COMMIT_LINK", env)
copyEnv("CI_COMMIT_MESSAGE", "DRONE_COMMIT_MESSAGE", env)
copyEnv("CI_COMMIT_AUTHOR", "DRONE_COMMIT_AUTHOR", env)
copyEnv("CI_COMMIT_AUTHOR", "DRONE_COMMIT_AUTHOR_NAME", env)
@@ -60,6 +58,8 @@ func SetDroneEnviron(env map[string]string) {
copyEnv("CI_SYSTEM_HOST", "DRONE_SYSTEM_HOST", env)
copyEnv("CI_STEP_NUMBER", "DRONE_STEP_NUMBER", env)
+ env["DRONE_BUILD_STATUS"] = "success"
+
// some quirks
// Legacy env var to prevent the plugin from throwing an error
diff --git a/pipeline/frontend/metadata/drone_compatibility_test.go b/pipeline/frontend/metadata/drone_compatibility_test.go
index 2e06fdabf..f38bdc5e2 100644
--- a/pipeline/frontend/metadata/drone_compatibility_test.go
+++ b/pipeline/frontend/metadata/drone_compatibility_test.go
@@ -39,10 +39,8 @@ CI_COMMIT_TARGET_BRANCH=main
CI_MACHINE=7939910e431b
CI_PIPELINE_CREATED=1685749339
CI_PIPELINE_EVENT=pull_request
-CI_PIPELINE_FINISHED=1685749350
CI_PIPELINE_NUMBER=41
CI_PIPELINE_STARTED=1685749339
-CI_PIPELINE_STATUS=success
CI_PREV_COMMIT_AUTHOR=6543
CI_PREV_COMMIT_AUTHOR_AVATAR=https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173
CI_PREV_COMMIT_BRANCH=main
@@ -62,10 +60,8 @@ CI_REPO_DEFAULT_BRANCH=main
CI_REPO_NAME=todo-checker
CI_REPO_OWNER=Epsilon_02
CI_REPO_SCM=git
-CI_STEP_FINISHED=1685749350
CI_STEP_NAME=wp_01h1z7v5d1tskaqjexw0ng6w7d_0_step_3
CI_STEP_STARTED=1685749339
-CI_STEP_STATUS=success
CI_SYSTEM_PLATFORM=linux/amd64
CI_SYSTEM_HOST=ci.codeberg.org
CI_SYSTEM_NAME=woodpecker
@@ -77,7 +73,6 @@ CI_WORKSPACE=/woodpecker/src/codeberg.org/Epsilon_02/todo-checker`
droneVars := `DRONE_BRANCH=main
DRONE_BUILD_CREATED=1685749339
DRONE_BUILD_EVENT=pull_request
-DRONE_BUILD_FINISHED=1685749350
DRONE_BUILD_NUMBER=41
DRONE_BUILD_STARTED=1685749339
DRONE_BUILD_STATUS=success
@@ -126,7 +121,6 @@ CI_COMMIT_SHA=8826c98181353075bbeee8f99b400496488e3523
CI_COMMIT_SOURCE_BRANCH=
CI_COMMIT_TAG=
CI_COMMIT_TARGET_BRANCH=
-CI_COMMIT_URL=http://1.2.3.4:3000/test/woodpecker-test/commit/8826c98181353075bbeee8f99b400496488e3523
CI_FORGE_TYPE=gitea
CI_FORGE_URL=http://1.2.3.4:3000
CI_MACHINE=hagalaz
@@ -135,12 +129,10 @@ CI_PIPELINE_DEPLOY_TARGET=
CI_PIPELINE_DEPLOY_TASK=
CI_PIPELINE_EVENT=push
CI_PIPELINE_FILES=[".woodpecker.yaml"]
-CI_PIPELINE_FINISHED=1721328738
CI_PIPELINE_FORGE_URL=http://1.2.3.4:3000/test/woodpecker-test/commit/8826c98181353075bbeee8f99b400496488e3523
CI_PIPELINE_NUMBER=24
CI_PIPELINE_PARENT=23
CI_PIPELINE_STARTED=1721328737
-CI_PIPELINE_STATUS=success
CI_PIPELINE_URL=http://1.2.3.4:8000/repos/2/pipeline/24
CI_PREV_COMMIT_AUTHOR=test
CI_PREV_COMMIT_AUTHOR_AVATAR=http://1.2.3.4:3000/avatars/dd46a756faad4727fb679320751f6dea
@@ -151,6 +143,8 @@ CI_PREV_COMMIT_REF=refs/heads/main
CI_PREV_COMMIT_REFSPEC=
CI_PREV_COMMIT_SHA=8826c98181353075bbeee8f99b400496488e3523
CI_PREV_COMMIT_URL=http://1.2.3.4:3000/test/woodpecker-test/commit/8826c98181353075bbeee8f99b400496488e3523
+CI_PREV_COMMIT_SOURCE_BRANCH=
+CI_PREV_COMMIT_TARGET_BRANCH=
CI_PREV_PIPELINE_CREATED=1721086039
CI_PREV_PIPELINE_DEPLOY_TARGET=
CI_PREV_PIPELINE_DEPLOY_TASK=
@@ -172,12 +166,13 @@ CI_REPO_PRIVATE=false
CI_REPO_REMOTE_ID=4
CI_REPO_SCM=git
CI_REPO_TRUSTED=false
+CI_REPO_TRUSTED_NETWORK=false
+CI_REPO_TRUSTED_VOLUMES=false
+CI_REPO_TRUSTED_SECURITY=false
CI_REPO_URL=http://1.2.3.4:3000/test/woodpecker-test
-CI_STEP_FINISHED=1721328738
CI_STEP_NAME=
CI_STEP_NUMBER=0
CI_STEP_STARTED=1721328737
-CI_STEP_STATUS=success
CI_STEP_URL=http://1.2.3.4:8000/repos/2/pipeline/24
CI_SYSTEM_HOST=1.2.3.4:8000
CI_SYSTEM_NAME=woodpecker
@@ -191,7 +186,6 @@ CI_WORKSPACE=/usr/local/src/1.2.3.4/test/woodpecker-test`
droneVars := `DRONE_BRANCH=main
DRONE_BUILD_CREATED=1721328737
DRONE_BUILD_EVENT=push
-DRONE_BUILD_FINISHED=1721328738
DRONE_BUILD_LINK=http://1.2.3.4:8000/repos/2/pipeline/24
DRONE_BUILD_NUMBER=24
DRONE_BUILD_PARENT=23
diff --git a/pipeline/frontend/metadata/environment.go b/pipeline/frontend/metadata/environment.go
index ccb4396b8..25ac55d31 100644
--- a/pipeline/frontend/metadata/environment.go
+++ b/pipeline/frontend/metadata/environment.go
@@ -30,32 +30,43 @@ var (
maxChangedFiles = 500
)
-// Environ returns the metadata as a map of environment variables.
-func (m *Metadata) Environ() map[string]string {
+func getSourceTargetBranches(refspec string) (string, string) {
var (
sourceBranch string
targetBranch string
)
- branchParts := strings.Split(m.Curr.Commit.Refspec, ":")
+ branchParts := strings.Split(refspec, ":")
if len(branchParts) == 2 { //nolint:mnd
sourceBranch = branchParts[0]
targetBranch = branchParts[1]
}
+ return sourceBranch, targetBranch
+}
+
+// Environ returns the metadata as a map of environment variables.
+func (m *Metadata) Environ() map[string]string {
+ sourceBranch, targetBranch := getSourceTargetBranches(m.Curr.Commit.Refspec)
+ prevSourceBranch, prevTargetBranch := getSourceTargetBranches(m.Prev.Commit.Refspec)
+
params := map[string]string{
- "CI": m.Sys.Name,
- "CI_REPO": path.Join(m.Repo.Owner, m.Repo.Name),
- "CI_REPO_NAME": m.Repo.Name,
- "CI_REPO_OWNER": m.Repo.Owner,
- "CI_REPO_REMOTE_ID": m.Repo.RemoteID,
- "CI_REPO_SCM": "git",
- "CI_REPO_URL": m.Repo.ForgeURL,
- "CI_REPO_CLONE_URL": m.Repo.CloneURL,
- "CI_REPO_CLONE_SSH_URL": m.Repo.CloneSSHURL,
- "CI_REPO_DEFAULT_BRANCH": m.Repo.Branch,
- "CI_REPO_PRIVATE": strconv.FormatBool(m.Repo.Private),
- "CI_REPO_TRUSTED": strconv.FormatBool(m.Repo.Trusted),
+ "CI": m.Sys.Name,
+ "CI_REPO": path.Join(m.Repo.Owner, m.Repo.Name),
+ "CI_REPO_NAME": m.Repo.Name,
+ "CI_REPO_OWNER": m.Repo.Owner,
+ "CI_REPO_REMOTE_ID": m.Repo.RemoteID,
+ "CI_REPO_SCM": m.Repo.SCM,
+ "CI_REPO_URL": m.Repo.ForgeURL,
+ "CI_REPO_CLONE_URL": m.Repo.CloneURL,
+ "CI_REPO_CLONE_SSH_URL": m.Repo.CloneSSHURL,
+ "CI_REPO_DEFAULT_BRANCH": m.Repo.Branch,
+ "CI_REPO_PRIVATE": strconv.FormatBool(m.Repo.Private),
+ "CI_REPO_TRUSTED_NETWORK": strconv.FormatBool(m.Repo.Trusted.Network),
+ "CI_REPO_TRUSTED_VOLUMES": strconv.FormatBool(m.Repo.Trusted.Volumes),
+ "CI_REPO_TRUSTED_SECURITY": strconv.FormatBool(m.Repo.Trusted.Security),
+ // Deprecated remove in 4.x
+ "CI_REPO_TRUSTED": strconv.FormatBool(m.Repo.Trusted.Security && m.Repo.Trusted.Network && m.Repo.Trusted.Volumes),
"CI_COMMIT_SHA": m.Curr.Commit.Sha,
"CI_COMMIT_REF": m.Curr.Commit.Ref,
@@ -78,20 +89,16 @@ func (m *Metadata) Environ() map[string]string {
"CI_PIPELINE_FORGE_URL": m.Curr.ForgeURL,
"CI_PIPELINE_DEPLOY_TARGET": m.Curr.DeployTo,
"CI_PIPELINE_DEPLOY_TASK": m.Curr.DeployTask,
- "CI_PIPELINE_STATUS": m.Curr.Status,
"CI_PIPELINE_CREATED": strconv.FormatInt(m.Curr.Created, 10),
"CI_PIPELINE_STARTED": strconv.FormatInt(m.Curr.Started, 10),
- "CI_PIPELINE_FINISHED": strconv.FormatInt(m.Curr.Finished, 10),
"CI_WORKFLOW_NAME": m.Workflow.Name,
"CI_WORKFLOW_NUMBER": strconv.Itoa(m.Workflow.Number),
- "CI_STEP_NAME": m.Step.Name,
- "CI_STEP_NUMBER": strconv.Itoa(m.Step.Number),
- "CI_STEP_STATUS": "", // will be set by agent
- "CI_STEP_STARTED": "", // will be set by agent
- "CI_STEP_FINISHED": "", // will be set by agent
- "CI_STEP_URL": m.getPipelineWebURL(m.Curr, m.Step.Number),
+ "CI_STEP_NAME": m.Step.Name,
+ "CI_STEP_NUMBER": strconv.Itoa(m.Step.Number),
+ "CI_STEP_STARTED": "", // will be set by agent
+ "CI_STEP_URL": m.getPipelineWebURL(m.Curr, m.Step.Number),
"CI_PREV_COMMIT_SHA": m.Prev.Commit.Sha,
"CI_PREV_COMMIT_REF": m.Prev.Commit.Ref,
@@ -102,6 +109,8 @@ func (m *Metadata) Environ() map[string]string {
"CI_PREV_COMMIT_AUTHOR": m.Prev.Commit.Author.Name,
"CI_PREV_COMMIT_AUTHOR_EMAIL": m.Prev.Commit.Author.Email,
"CI_PREV_COMMIT_AUTHOR_AVATAR": m.Prev.Commit.Author.Avatar,
+ "CI_PREV_COMMIT_SOURCE_BRANCH": prevSourceBranch,
+ "CI_PREV_COMMIT_TARGET_BRANCH": prevTargetBranch,
"CI_PREV_PIPELINE_NUMBER": strconv.FormatInt(m.Prev.Number, 10),
"CI_PREV_PIPELINE_PARENT": strconv.FormatInt(m.Prev.Parent, 10),
@@ -123,9 +132,6 @@ func (m *Metadata) Environ() map[string]string {
"CI_FORGE_TYPE": m.Forge.Type,
"CI_FORGE_URL": m.Forge.URL,
-
- // TODO: Deprecated, remove in 3.x
- "CI_COMMIT_URL": m.Curr.ForgeURL,
}
if m.Curr.Event == EventTag || m.Curr.Event == EventRelease || strings.HasPrefix(m.Curr.Commit.Ref, "refs/tags/") {
params["CI_COMMIT_TAG"] = strings.TrimPrefix(m.Curr.Commit.Ref, "refs/tags/")
diff --git a/pipeline/frontend/metadata/types.go b/pipeline/frontend/metadata/types.go
index 9cf7e64a1..5fa56e85e 100644
--- a/pipeline/frontend/metadata/types.go
+++ b/pipeline/frontend/metadata/types.go
@@ -29,17 +29,17 @@ type (
// Repo defines runtime metadata for a repository.
Repo struct {
- ID int64 `json:"id,omitempty"`
- Name string `json:"name,omitempty"`
- Owner string `json:"owner,omitempty"`
- RemoteID string `json:"remote_id,omitempty"`
- ForgeURL string `json:"forge_url,omitempty"`
- CloneURL string `json:"clone_url,omitempty"`
- CloneSSHURL string `json:"clone_url_ssh,omitempty"`
- Private bool `json:"private,omitempty"`
- Secrets []Secret `json:"secrets,omitempty"`
- Branch string `json:"default_branch,omitempty"`
- Trusted bool `json:"trusted,omitempty"`
+ ID int64 `json:"id,omitempty"`
+ Name string `json:"name,omitempty"`
+ Owner string `json:"owner,omitempty"`
+ RemoteID string `json:"remote_id,omitempty"`
+ ForgeURL string `json:"forge_url,omitempty"`
+ SCM string `json:"scm,omitempty"`
+ CloneURL string `json:"clone_url,omitempty"`
+ CloneSSHURL string `json:"clone_url_ssh,omitempty"`
+ Private bool `json:"private,omitempty"`
+ Branch string `json:"default_branch,omitempty"`
+ Trusted TrustedConfiguration `json:"trusted,omitempty"`
}
// Pipeline defines runtime metadata for a pipeline.
@@ -91,14 +91,6 @@ type (
Number int `json:"number,omitempty"`
}
- // Secret defines a runtime secret.
- Secret struct {
- Name string `json:"name,omitempty"`
- Value string `json:"value,omitempty"`
- Mount string `json:"mount,omitempty"`
- Mask bool `json:"mask,omitempty"`
- }
-
// System defines runtime metadata for a ci/cd system.
System struct {
Name string `json:"name,omitempty"`
@@ -121,4 +113,10 @@ type (
// URL returns the root url of a configured forge
URL() string
}
+
+ TrustedConfiguration struct {
+ Network bool `json:"network,omitempty"`
+ Volumes bool `json:"volumes,omitempty"`
+ Security bool `json:"security,omitempty"`
+ }
)
diff --git a/pipeline/frontend/yaml/compiler/compiler.go b/pipeline/frontend/yaml/compiler/compiler.go
index 9525a3a12..be2b59cbc 100644
--- a/pipeline/frontend/yaml/compiler/compiler.go
+++ b/pipeline/frontend/yaml/compiler/compiler.go
@@ -46,10 +46,10 @@ type Secret struct {
func (s *Secret) Available(event string, container *yaml_types.Container) error {
onlyAllowSecretForPlugins := len(s.AllowedPlugins) > 0
if onlyAllowSecretForPlugins && !container.IsPlugin() {
- return fmt.Errorf("secret %q only allowed to be used by plugins by step %q", s.Name, container.Name)
+ return fmt.Errorf("secret %q is only allowed to be used by plugins (a filter has been set on the secret). Note: Image filters do not work for normal steps", s.Name)
}
- if onlyAllowSecretForPlugins && !utils.MatchImage(container.Image, s.AllowedPlugins...) {
+ if onlyAllowSecretForPlugins && !utils.MatchImageDynamic(container.Image, s.AllowedPlugins...) {
return fmt.Errorf("secret %q is not allowed to be used with image %q by step %q", s.Name, container.Image, container.Name)
}
@@ -81,41 +81,34 @@ func (s *Secret) Match(event string) bool {
return false
}
-type ResourceLimit struct {
- MemSwapLimit int64
- MemLimit int64
- ShmSize int64
- CPUQuota int64
- CPUShares int64
- CPUSet string
-}
-
// Compiler compiles the yaml.
type Compiler struct {
- local bool
- escalated []string
- prefix string
- volumes []string
- networks []string
- env map[string]string
- cloneEnv map[string]string
- workspaceBase string
- workspacePath string
- metadata metadata.Metadata
- registries []Registry
- secrets map[string]Secret
- reslimit ResourceLimit
- defaultCloneImage string
- trustedPipeline bool
- netrcOnlyTrusted bool
+ local bool
+ escalated []string
+ prefix string
+ volumes []string
+ networks []string
+ env map[string]string
+ cloneEnv map[string]string
+ workspaceBase string
+ workspacePath string
+ metadata metadata.Metadata
+ registries []Registry
+ secrets map[string]Secret
+ defaultClonePlugin string
+ trustedClonePlugins []string
+ securityTrustedPipeline bool
+ netrcOnlyTrusted bool
}
// New creates a new Compiler with options.
func New(opts ...Option) *Compiler {
compiler := &Compiler{
- env: map[string]string{},
- cloneEnv: map[string]string{},
- secrets: map[string]Secret{},
+ env: map[string]string{},
+ cloneEnv: map[string]string{},
+ secrets: map[string]Secret{},
+ defaultClonePlugin: constant.DefaultClonePlugin,
+ trustedClonePlugins: constant.TrustedClonePlugins,
}
for _, opt := range opts {
opt(compiler)
@@ -163,20 +156,15 @@ func (c *Compiler) Compile(conf *yaml_types.Workflow) (*backend_types.Config, er
c.workspacePath = path.Clean(conf.Workspace.Path)
}
- cloneImage := constant.DefaultCloneImage
- if len(c.defaultCloneImage) > 0 {
- cloneImage = c.defaultCloneImage
- }
-
// add default clone step
- if !c.local && len(conf.Clone.ContainerList) == 0 && !conf.SkipClone {
+ if !c.local && len(conf.Clone.ContainerList) == 0 && !conf.SkipClone && len(c.defaultClonePlugin) != 0 {
cloneSettings := map[string]any{"depth": "0"}
if c.metadata.Curr.Event == metadata.EventTag {
cloneSettings["tags"] = "true"
}
container := &yaml_types.Container{
Name: defaultCloneName,
- Image: cloneImage,
+ Image: c.defaultClonePlugin,
Settings: cloneSettings,
Environment: make(map[string]any),
}
@@ -208,7 +196,7 @@ func (c *Compiler) Compile(conf *yaml_types.Workflow) (*backend_types.Config, er
}
// only inject netrc if it's a trusted repo or a trusted plugin
- if !c.netrcOnlyTrusted || c.trustedPipeline || (container.IsPlugin() && container.IsTrustedCloneImage()) {
+ if !c.netrcOnlyTrusted || c.securityTrustedPipeline || (container.IsPlugin() && container.IsTrustedCloneImage(c.trustedClonePlugins)) {
for k, v := range c.cloneEnv {
step.Environment[k] = v
}
@@ -265,7 +253,7 @@ func (c *Compiler) Compile(conf *yaml_types.Workflow) (*backend_types.Config, er
}
// inject netrc if it's a trusted repo or a trusted clone-plugin
- if c.trustedPipeline || (container.IsPlugin() && container.IsTrustedCloneImage()) {
+ if c.securityTrustedPipeline || (container.IsPlugin() && container.IsTrustedCloneImage(c.trustedClonePlugins)) {
for k, v := range c.cloneEnv {
step.Environment[k] = v
}
@@ -275,7 +263,6 @@ func (c *Compiler) Compile(conf *yaml_types.Workflow) (*backend_types.Config, er
step: step,
position: pos,
name: container.Name,
- group: container.Group,
dependsOn: container.DependsOn,
})
}
diff --git a/pipeline/frontend/yaml/compiler/compiler_test.go b/pipeline/frontend/yaml/compiler/compiler_test.go
index d391b5506..dadbcd5dd 100644
--- a/pipeline/frontend/yaml/compiler/compiler_test.go
+++ b/pipeline/frontend/yaml/compiler/compiler_test.go
@@ -50,7 +50,7 @@ func TestSecretAvailable(t *testing.T) {
assert.ErrorContains(t, secret.Available("push", &yaml_types.Container{
Image: "golang",
Commands: yaml_base_types.StringOrSlice{"echo 'this is not a plugin'"},
- }), "only allowed to be used by plugins by step")
+ }), "is only allowed to be used by plugins (a filter has been set on the secret). Note: Image filters do not work for normal steps")
assert.ErrorContains(t, secret.Available("push", &yaml_types.Container{
Image: "not-golang",
Commands: yaml_base_types.StringOrSlice{},
@@ -90,15 +90,16 @@ func TestCompilerCompile(t *testing.T) {
defaultCloneStage := &backend_types.Stage{
Steps: []*backend_types.Step{{
- Name: "clone",
- Type: backend_types.StepTypeClone,
- Image: constant.DefaultCloneImage,
- OnSuccess: true,
- Failure: "fail",
- Volumes: []string{defaultVolumes[0].Name + ":/woodpecker"},
- WorkingDir: "/woodpecker/src/github.com/octocat/hello-world",
- Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"clone"}}},
- ExtraHosts: []backend_types.HostAlias{},
+ Name: "clone",
+ Type: backend_types.StepTypeClone,
+ Image: constant.DefaultClonePlugin,
+ OnSuccess: true,
+ Failure: "fail",
+ Volumes: []string{defaultVolumes[0].Name + ":/woodpecker"},
+ WorkingDir: "/woodpecker/src/github.com/octocat/hello-world",
+ WorkspaceBase: "/woodpecker",
+ Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"clone"}}},
+ ExtraHosts: []backend_types.HostAlias{},
}},
}
@@ -136,77 +137,83 @@ func TestCompilerCompile(t *testing.T) {
Volumes: defaultVolumes,
Stages: []*backend_types.Stage{defaultCloneStage, {
Steps: []*backend_types.Step{{
- Name: "dummy",
- Type: backend_types.StepTypePlugin,
- Image: "dummy_img",
- OnSuccess: true,
- Failure: "fail",
- Volumes: []string{defaultVolumes[0].Name + ":/woodpecker"},
- WorkingDir: "/woodpecker/src/github.com/octocat/hello-world",
- Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"dummy"}}},
- ExtraHosts: []backend_types.HostAlias{},
+ Name: "dummy",
+ Type: backend_types.StepTypePlugin,
+ Image: "dummy_img",
+ OnSuccess: true,
+ Failure: "fail",
+ Volumes: []string{defaultVolumes[0].Name + ":/woodpecker"},
+ WorkingDir: "/woodpecker/src/github.com/octocat/hello-world",
+ WorkspaceBase: "/woodpecker",
+ Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"dummy"}}},
+ ExtraHosts: []backend_types.HostAlias{},
}},
}},
},
},
{
- name: "workflow with three steps and one group",
+ name: "workflow with three steps",
fronConf: &yaml_types.Workflow{Steps: yaml_types.ContainerList{ContainerList: []*yaml_types.Container{{
Name: "echo env",
Image: "bash",
Commands: []string{"env"},
}, {
Name: "parallel echo 1",
- Group: "parallel",
Image: "bash",
Commands: []string{"echo 1"},
}, {
Name: "parallel echo 2",
- Group: "parallel",
Image: "bash",
Commands: []string{"echo 2"},
}}}},
backConf: &backend_types.Config{
Networks: defaultNetworks,
Volumes: defaultVolumes,
- Stages: []*backend_types.Stage{defaultCloneStage, {
- Steps: []*backend_types.Step{{
- Name: "echo env",
- Type: backend_types.StepTypeCommands,
- Image: "bash",
- Commands: []string{"env"},
- OnSuccess: true,
- Failure: "fail",
- Volumes: []string{defaultVolumes[0].Name + ":/test"},
- WorkingDir: "/test/src/github.com/octocat/hello-world",
- Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"echo env"}}},
- ExtraHosts: []backend_types.HostAlias{},
- }},
- }, {
- Steps: []*backend_types.Step{{
- Name: "parallel echo 1",
- Type: backend_types.StepTypeCommands,
- Image: "bash",
- Commands: []string{"echo 1"},
- OnSuccess: true,
- Failure: "fail",
- Volumes: []string{defaultVolumes[0].Name + ":/test"},
- WorkingDir: "/test/src/github.com/octocat/hello-world",
- Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"parallel echo 1"}}},
- ExtraHosts: []backend_types.HostAlias{},
+ Stages: []*backend_types.Stage{
+ defaultCloneStage, {
+ Steps: []*backend_types.Step{{
+ Name: "echo env",
+ Type: backend_types.StepTypeCommands,
+ Image: "bash",
+ Commands: []string{"env"},
+ OnSuccess: true,
+ Failure: "fail",
+ Volumes: []string{defaultVolumes[0].Name + ":/test"},
+ WorkingDir: "/test/src/github.com/octocat/hello-world",
+ WorkspaceBase: "/test",
+ Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"echo env"}}},
+ ExtraHosts: []backend_types.HostAlias{},
+ }},
}, {
- Name: "parallel echo 2",
- Type: backend_types.StepTypeCommands,
- Image: "bash",
- Commands: []string{"echo 2"},
- OnSuccess: true,
- Failure: "fail",
- Volumes: []string{defaultVolumes[0].Name + ":/test"},
- WorkingDir: "/test/src/github.com/octocat/hello-world",
- Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"parallel echo 2"}}},
- ExtraHosts: []backend_types.HostAlias{},
- }},
- }},
+ Steps: []*backend_types.Step{{
+ Name: "parallel echo 1",
+ Type: backend_types.StepTypeCommands,
+ Image: "bash",
+ Commands: []string{"echo 1"},
+ OnSuccess: true,
+ Failure: "fail",
+ Volumes: []string{defaultVolumes[0].Name + ":/test"},
+ WorkingDir: "/test/src/github.com/octocat/hello-world",
+ WorkspaceBase: "/test",
+ Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"parallel echo 1"}}},
+ ExtraHosts: []backend_types.HostAlias{},
+ }},
+ }, {
+ Steps: []*backend_types.Step{{
+ Name: "parallel echo 2",
+ Type: backend_types.StepTypeCommands,
+ Image: "bash",
+ Commands: []string{"echo 2"},
+ OnSuccess: true,
+ Failure: "fail",
+ Volumes: []string{defaultVolumes[0].Name + ":/test"},
+ WorkingDir: "/test/src/github.com/octocat/hello-world",
+ WorkspaceBase: "/test",
+ Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"parallel echo 2"}}},
+ ExtraHosts: []backend_types.HostAlias{},
+ }},
+ },
+ },
},
},
{
@@ -230,40 +237,43 @@ func TestCompilerCompile(t *testing.T) {
Volumes: defaultVolumes,
Stages: []*backend_types.Stage{defaultCloneStage, {
Steps: []*backend_types.Step{{
- Name: "echo env",
- Type: backend_types.StepTypeCommands,
- Image: "bash",
- Commands: []string{"env"},
- OnSuccess: true,
- Failure: "fail",
- Volumes: []string{defaultVolumes[0].Name + ":/test"},
- WorkingDir: "/test/src/github.com/octocat/hello-world",
- Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"echo env"}}},
- ExtraHosts: []backend_types.HostAlias{},
+ Name: "echo env",
+ Type: backend_types.StepTypeCommands,
+ Image: "bash",
+ Commands: []string{"env"},
+ OnSuccess: true,
+ Failure: "fail",
+ Volumes: []string{defaultVolumes[0].Name + ":/test"},
+ WorkingDir: "/test/src/github.com/octocat/hello-world",
+ WorkspaceBase: "/test",
+ Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"echo env"}}},
+ ExtraHosts: []backend_types.HostAlias{},
}, {
- Name: "echo 2",
- Type: backend_types.StepTypeCommands,
- Image: "bash",
- Commands: []string{"echo 2"},
- OnSuccess: true,
- Failure: "fail",
- Volumes: []string{defaultVolumes[0].Name + ":/test"},
- WorkingDir: "/test/src/github.com/octocat/hello-world",
- Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"echo 2"}}},
- ExtraHosts: []backend_types.HostAlias{},
+ Name: "echo 2",
+ Type: backend_types.StepTypeCommands,
+ Image: "bash",
+ Commands: []string{"echo 2"},
+ OnSuccess: true,
+ Failure: "fail",
+ Volumes: []string{defaultVolumes[0].Name + ":/test"},
+ WorkingDir: "/test/src/github.com/octocat/hello-world",
+ WorkspaceBase: "/test",
+ Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"echo 2"}}},
+ ExtraHosts: []backend_types.HostAlias{},
}},
}, {
Steps: []*backend_types.Step{{
- Name: "echo 1",
- Type: backend_types.StepTypeCommands,
- Image: "bash",
- Commands: []string{"echo 1"},
- OnSuccess: true,
- Failure: "fail",
- Volumes: []string{defaultVolumes[0].Name + ":/test"},
- WorkingDir: "/test/src/github.com/octocat/hello-world",
- Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"echo 1"}}},
- ExtraHosts: []backend_types.HostAlias{},
+ Name: "echo 1",
+ Type: backend_types.StepTypeCommands,
+ Image: "bash",
+ Commands: []string{"echo 1"},
+ OnSuccess: true,
+ Failure: "fail",
+ Volumes: []string{defaultVolumes[0].Name + ":/test"},
+ WorkingDir: "/test/src/github.com/octocat/hello-world",
+ WorkspaceBase: "/test",
+ Networks: []backend_types.Conn{{Name: "test_default", Aliases: []string{"echo 1"}}},
+ ExtraHosts: []backend_types.HostAlias{},
}},
}},
},
@@ -274,7 +284,7 @@ func TestCompilerCompile(t *testing.T) {
Name: "step",
Image: "bash",
Commands: []string{"env"},
- Secrets: yaml_types.Secrets{Secrets: []*yaml_types.Secret{{Source: "missing", Target: "missing"}}},
+ Secrets: []string{"missing"},
}}}},
backConf: nil,
expectedErr: "secret \"missing\" not found",
diff --git a/pipeline/frontend/yaml/compiler/convert.go b/pipeline/frontend/yaml/compiler/convert.go
index df4c3ec8d..b31747aa1 100644
--- a/pipeline/frontend/yaml/compiler/convert.go
+++ b/pipeline/frontend/yaml/compiler/convert.go
@@ -125,23 +125,20 @@ func (c *Compiler) createProcess(container *yaml_types.Container, stepType backe
return nil, err
}
- for _, requested := range container.Secrets.Secrets {
- secretValue, err := getSecretValue(requested.Source)
+ for _, requested := range container.Secrets {
+ secretValue, err := getSecretValue(requested)
if err != nil {
return nil, err
}
- toUpperTarget := strings.ToUpper(requested.Target)
- if !environmentAllowed(toUpperTarget, stepType) {
+ if !environmentAllowed(requested, stepType) {
continue
}
- environment[requested.Target] = secretValue
- // TODO: deprecated, remove in 3.x
- environment[toUpperTarget] = secretValue
+ environment[requested] = secretValue
}
- if utils.MatchImage(container.Image, c.escalated...) && container.IsPlugin() {
+ if utils.MatchImageDynamic(container.Image, c.escalated...) && container.IsPlugin() {
privileged = true
}
@@ -154,31 +151,6 @@ func (c *Compiler) createProcess(container *yaml_types.Container, stepType backe
}
}
- memSwapLimit := int64(container.MemSwapLimit)
- if c.reslimit.MemSwapLimit != 0 {
- memSwapLimit = c.reslimit.MemSwapLimit
- }
- memLimit := int64(container.MemLimit)
- if c.reslimit.MemLimit != 0 {
- memLimit = c.reslimit.MemLimit
- }
- shmSize := int64(container.ShmSize)
- if c.reslimit.ShmSize != 0 {
- shmSize = c.reslimit.ShmSize
- }
- cpuQuota := int64(container.CPUQuota)
- if c.reslimit.CPUQuota != 0 {
- cpuQuota = c.reslimit.CPUQuota
- }
- cpuShares := int64(container.CPUShares)
- if c.reslimit.CPUShares != 0 {
- cpuShares = c.reslimit.CPUShares
- }
- cpuSet := container.CPUSet
- if c.reslimit.CPUSet != "" {
- cpuSet = c.reslimit.CPUSet
- }
-
var ports []backend_types.Port
for _, portDef := range container.Ports {
port, err := convertPort(portDef)
@@ -207,6 +179,7 @@ func (c *Compiler) createProcess(container *yaml_types.Container, stepType backe
Detached: detached,
Privileged: privileged,
WorkingDir: workingDir,
+ WorkspaceBase: workspaceBase,
Environment: environment,
Commands: container.Commands,
Entrypoint: container.Entrypoint,
@@ -217,12 +190,6 @@ func (c *Compiler) createProcess(container *yaml_types.Container, stepType backe
Networks: networks,
DNS: container.DNS,
DNSSearch: container.DNSSearch,
- MemSwapLimit: memSwapLimit,
- MemLimit: memLimit,
- ShmSize: shmSize,
- CPUQuota: cpuQuota,
- CPUShares: cpuShares,
- CPUSet: cpuSet,
AuthConfig: authConfig,
OnSuccess: onSuccess,
OnFailure: onFailure,
diff --git a/pipeline/frontend/yaml/compiler/dag.go b/pipeline/frontend/yaml/compiler/dag.go
index 461807259..deb673e4c 100644
--- a/pipeline/frontend/yaml/compiler/dag.go
+++ b/pipeline/frontend/yaml/compiler/dag.go
@@ -24,7 +24,6 @@ type dagCompilerStep struct {
step *backend_types.Step
position int
name string
- group string
dependsOn []string
}
@@ -51,25 +50,16 @@ func (c dagCompiler) compile() ([]*backend_types.Stage, error) {
if c.isDAG() {
return c.compileByDependsOn()
}
- return c.compileByGroup()
+ return c.compileSequence()
}
-func (c dagCompiler) compileByGroup() ([]*backend_types.Stage, error) {
+func (c dagCompiler) compileSequence() ([]*backend_types.Stage, error) {
stages := make([]*backend_types.Stage, 0, len(c.steps))
- var currentStage *backend_types.Stage
- var currentGroup string
for _, s := range c.steps {
- // create a new stage if current step is in a new group compared to last one
- if currentStage == nil || currentGroup != s.group || s.group == "" {
- currentGroup = s.group
-
- currentStage = new(backend_types.Stage)
- stages = append(stages, currentStage)
- }
-
- // add step to current stage
- currentStage.Steps = append(currentStage.Steps, s.step)
+ stages = append(stages, &backend_types.Stage{
+ Steps: []*backend_types.Step{s.step},
+ })
}
return stages, nil
diff --git a/pipeline/frontend/yaml/compiler/dag_test.go b/pipeline/frontend/yaml/compiler/dag_test.go
index 51dd3b5a6..620b67776 100644
--- a/pipeline/frontend/yaml/compiler/dag_test.go
+++ b/pipeline/frontend/yaml/compiler/dag_test.go
@@ -85,7 +85,6 @@ func TestConvertDAGToStages(t *testing.T) {
"echo env": {
position: 0,
name: "echo env",
- group: "",
step: &backend_types.Step{
UUID: "01HJDPEW6R7J0JBE3F1T7Q0TYX",
Type: "commands",
@@ -96,7 +95,6 @@ func TestConvertDAGToStages(t *testing.T) {
"echo 1": {
position: 1,
name: "echo 1",
- group: "",
dependsOn: []string{"echo env", "echo 2"},
step: &backend_types.Step{
UUID: "01HJDPF770QGRZER8RF79XVS4M",
@@ -108,7 +106,6 @@ func TestConvertDAGToStages(t *testing.T) {
"echo 2": {
position: 2,
name: "echo 2",
- group: "",
step: &backend_types.Step{
UUID: "01HJDPFF5RMEYZW0YTGR1Y1ZR0",
Type: "commands",
diff --git a/pipeline/frontend/yaml/compiler/option.go b/pipeline/frontend/yaml/compiler/option.go
index dd2d558e5..3787bbd82 100644
--- a/pipeline/frontend/yaml/compiler/option.go
+++ b/pipeline/frontend/yaml/compiler/option.go
@@ -157,31 +157,22 @@ func WithNetworks(networks ...string) Option {
}
}
-// WithResourceLimit configures the compiler with default resource limits that
-// are applied each container in the pipeline.
-func WithResourceLimit(swap, mem, shmSize, cpuQuota, cpuShares int64, cpuSet string) Option {
+func WithDefaultClonePlugin(cloneImage string) Option {
return func(compiler *Compiler) {
- compiler.reslimit = ResourceLimit{
- MemSwapLimit: swap,
- MemLimit: mem,
- ShmSize: shmSize,
- CPUQuota: cpuQuota,
- CPUShares: cpuShares,
- CPUSet: cpuSet,
- }
+ compiler.defaultClonePlugin = cloneImage
}
}
-func WithDefaultCloneImage(cloneImage string) Option {
+func WithTrustedClonePlugins(images []string) Option {
return func(compiler *Compiler) {
- compiler.defaultCloneImage = cloneImage
+ compiler.trustedClonePlugins = images
}
}
-// WithTrusted configures the compiler with the trusted repo option.
-func WithTrusted(trusted bool) Option {
+// WithTrustedSecurity configures the compiler with the trusted repo option.
+func WithTrustedSecurity(trusted bool) Option {
return func(compiler *Compiler) {
- compiler.trustedPipeline = trusted
+ compiler.securityTrustedPipeline = trusted
}
}
diff --git a/pipeline/frontend/yaml/compiler/option_test.go b/pipeline/frontend/yaml/compiler/option_test.go
index 48ed13d48..b4c179d20 100644
--- a/pipeline/frontend/yaml/compiler/option_test.go
+++ b/pipeline/frontend/yaml/compiler/option_test.go
@@ -20,6 +20,7 @@ import (
"github.com/stretchr/testify/assert"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/metadata"
+ "go.woodpecker-ci.org/woodpecker/v2/shared/constant"
)
func TestWithWorkspace(t *testing.T) {
@@ -66,25 +67,6 @@ func TestWithNetworks(t *testing.T) {
assert.Equal(t, "overlay_bar", compiler.networks[1])
}
-func TestWithResourceLimit(t *testing.T) {
- compiler := New(
- WithResourceLimit(
- 1,
- 2,
- 3,
- 4,
- 5,
- "0,2-5",
- ),
- )
- assert.EqualValues(t, 1, compiler.reslimit.MemSwapLimit)
- assert.EqualValues(t, 2, compiler.reslimit.MemLimit)
- assert.EqualValues(t, 3, compiler.reslimit.ShmSize)
- assert.EqualValues(t, 4, compiler.reslimit.CPUQuota)
- assert.EqualValues(t, 5, compiler.reslimit.CPUShares)
- assert.Equal(t, "0,2-5", compiler.reslimit.CPUSet)
-}
-
func TestWithPrefix(t *testing.T) {
assert.Equal(t, "someprefix_", New(WithPrefix("someprefix_")).prefix)
}
@@ -166,9 +148,17 @@ func TestWithEnviron(t *testing.T) {
assert.Equal(t, "true", compiler.env["SHOW"])
}
-func TestWithDefaultCloneImage(t *testing.T) {
+func TestDefaultClonePlugin(t *testing.T) {
compiler := New(
- WithDefaultCloneImage("not-an-image"),
+ WithDefaultClonePlugin("not-an-image"),
)
- assert.Equal(t, "not-an-image", compiler.defaultCloneImage)
+ assert.Equal(t, "not-an-image", compiler.defaultClonePlugin)
+}
+
+func TestWithTrustedClonePlugins(t *testing.T) {
+ compiler := New(WithTrustedClonePlugins([]string{"not-an-image"}))
+ assert.ElementsMatch(t, []string{"not-an-image"}, compiler.trustedClonePlugins)
+
+ compiler = New()
+ assert.ElementsMatch(t, constant.TrustedClonePlugins, compiler.trustedClonePlugins)
}
diff --git a/pipeline/frontend/yaml/compiler/settings/params.go b/pipeline/frontend/yaml/compiler/settings/params.go
index 08cdf26e9..f078643e6 100644
--- a/pipeline/frontend/yaml/compiler/settings/params.go
+++ b/pipeline/frontend/yaml/compiler/settings/params.go
@@ -44,8 +44,9 @@ func ParamsToEnv(from map[string]any, to map[string]string, prefix string, upper
// sanitizeParamKey formats the environment variable key.
func sanitizeParamKey(prefix string, upper bool, k string) string {
- r := strings.ReplaceAll(strings.ReplaceAll(k, ".", "_"), "-", "_")
+ r := k
if upper {
+ r = strings.ReplaceAll(strings.ReplaceAll(k, ".", "_"), "-", "_")
r = strings.ToUpper(r)
}
return prefix + r
diff --git a/pipeline/frontend/yaml/compiler/settings/params_test.go b/pipeline/frontend/yaml/compiler/settings/params_test.go
index 5e3e6da12..386b58d02 100644
--- a/pipeline/frontend/yaml/compiler/settings/params_test.go
+++ b/pipeline/frontend/yaml/compiler/settings/params_test.go
@@ -110,8 +110,9 @@ func TestSanitizeParamKey(t *testing.T) {
assert.EqualValues(t, "PLUGIN_DRY_RUN", sanitizeParamKey("PLUGIN_", true, "dry-run"))
assert.EqualValues(t, "PLUGIN_DRY_RUN", sanitizeParamKey("PLUGIN_", true, "dry_Run"))
assert.EqualValues(t, "PLUGIN_DRY_RUN", sanitizeParamKey("PLUGIN_", true, "dry.run"))
- assert.EqualValues(t, "PLUGIN_dry_run", sanitizeParamKey("PLUGIN_", false, "dry-run"))
+ assert.EqualValues(t, "PLUGIN_dry-run", sanitizeParamKey("PLUGIN_", false, "dry-run"))
assert.EqualValues(t, "PLUGIN_dry_Run", sanitizeParamKey("PLUGIN_", false, "dry_Run"))
+ assert.EqualValues(t, "PLUGIN_dry.run", sanitizeParamKey("PLUGIN_", false, "dry.run"))
}
func TestYAMLToParamsToEnv(t *testing.T) {
diff --git a/pipeline/frontend/yaml/constraint/constraint.go b/pipeline/frontend/yaml/constraint/constraint.go
index 205f21fd3..28c29f2ab 100644
--- a/pipeline/frontend/yaml/constraint/constraint.go
+++ b/pipeline/frontend/yaml/constraint/constraint.go
@@ -18,6 +18,7 @@ import (
"fmt"
"maps"
"path"
+ "slices"
"strings"
"github.com/bmatcuk/doublestar/v4"
@@ -37,20 +38,18 @@ type (
}
Constraint struct {
- Ref List
- Repo List
- Instance List
- Platform List
- Environment List
- Branch List
- Cron List
- Status List
- Matrix Map
- Local yamlBaseTypes.BoolTrue
- Path Path
- Evaluate string `yaml:"evaluate,omitempty"`
- // TODO: change to StringOrSlice in 3.x
- Event List
+ Ref List
+ Repo List
+ Instance List
+ Platform List
+ Branch List
+ Cron List
+ Status List
+ Matrix Map
+ Local yamlBaseTypes.BoolTrue
+ Path Path
+ Evaluate string `yaml:"evaluate,omitempty"`
+ Event yamlBaseTypes.StringOrSlice
}
// List defines a runtime constraint for exclude & include string slices.
@@ -164,8 +163,7 @@ func (c *Constraint) Match(m metadata.Metadata, global bool, env map[string]stri
}
match = match && c.Platform.Match(m.Sys.Platform) &&
- c.Environment.Match(m.Curr.DeployTo) &&
- c.Event.Match(m.Curr.Event) &&
+ (len(c.Event) == 0 || slices.Contains(c.Event, m.Curr.Event)) &&
c.Repo.Match(path.Join(m.Repo.Owner, m.Repo.Name)) &&
c.Ref.Match(m.Curr.Commit.Ref) &&
c.Instance.Match(m.Sys.Host)
diff --git a/pipeline/frontend/yaml/linter/linter.go b/pipeline/frontend/yaml/linter/linter.go
index 4abc03ba4..71c4efe6f 100644
--- a/pipeline/frontend/yaml/linter/linter.go
+++ b/pipeline/frontend/yaml/linter/linter.go
@@ -24,11 +24,21 @@ import (
errorTypes "go.woodpecker-ci.org/woodpecker/v2/pipeline/errors/types"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/linter/schema"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/types"
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/utils"
+ "go.woodpecker-ci.org/woodpecker/v2/shared/constant"
)
// A Linter lints a pipeline configuration.
type Linter struct {
- trusted bool
+ trusted TrustedConfiguration
+ privilegedPlugins *[]string
+ trustedClonePlugins *[]string
+}
+
+type TrustedConfiguration struct {
+ Network bool
+ Volumes bool
+ Security bool
}
// New creates a new Linter with options.
@@ -71,6 +81,10 @@ func (l *Linter) lintFile(config *WorkflowConfig) error {
linterErr = multierr.Append(linterErr, newLinterError("Invalid or missing steps section", config.File, "steps", false))
}
+ if err := l.lintCloneSteps(config); err != nil {
+ linterErr = multierr.Append(linterErr, err)
+ }
+
if err := l.lintContainers(config, "clone"); err != nil {
linterErr = multierr.Append(linterErr, err)
}
@@ -94,6 +108,29 @@ func (l *Linter) lintFile(config *WorkflowConfig) error {
return linterErr
}
+func (l *Linter) lintCloneSteps(config *WorkflowConfig) error {
+ if len(config.Workflow.Clone.ContainerList) == 0 {
+ return nil
+ }
+
+ trustedClonePlugins := constant.TrustedClonePlugins
+ if l.trustedClonePlugins != nil {
+ trustedClonePlugins = *l.trustedClonePlugins
+ }
+
+ var linterErr error
+ for _, container := range config.Workflow.Clone.ContainerList {
+ if !utils.MatchImageDynamic(container.Image, trustedClonePlugins...) {
+ linterErr = multierr.Append(linterErr,
+ newLinterError(
+ "Specified clone image does not match allow list, netrc will not be injected",
+ config.File, fmt.Sprintf("clone.%s", container.Name), true),
+ )
+ }
+ }
+ return linterErr
+}
+
func (l *Linter) lintContainers(config *WorkflowConfig, area string) error {
var linterErr error
@@ -112,14 +149,15 @@ func (l *Linter) lintContainers(config *WorkflowConfig, area string) error {
if err := l.lintImage(config, container, area); err != nil {
linterErr = multierr.Append(linterErr, err)
}
- if !l.trusted {
- if err := l.lintTrusted(config, container, area); err != nil {
- linterErr = multierr.Append(linterErr, err)
- }
+ if err := l.lintTrusted(config, container, area); err != nil {
+ linterErr = multierr.Append(linterErr, err)
}
if err := l.lintSettings(config, container, area); err != nil {
linterErr = multierr.Append(linterErr, err)
}
+ if err := l.lintPrivilegedPlugins(config, container, area); err != nil {
+ linterErr = multierr.Append(linterErr, err)
+ }
}
return linterErr
@@ -132,6 +170,22 @@ func (l *Linter) lintImage(config *WorkflowConfig, c *types.Container, area stri
return nil
}
+func (l *Linter) lintPrivilegedPlugins(config *WorkflowConfig, c *types.Container, area string) error {
+ // lint for conflicts of https://github.com/woodpecker-ci/woodpecker/pull/3918
+ if utils.MatchImage(c.Image, "plugins/docker", "plugins/gcr", "plugins/ecr", "woodpeckerci/plugin-docker-buildx") {
+ msg := fmt.Sprintf("The formerly privileged plugin '%s' is no longer privileged by default, if required, add it to WOODPECKER_PLUGINS_PRIVILEGED", c.Image)
+ // check first if user did not add them back
+ if l.privilegedPlugins != nil && !utils.MatchImageDynamic(c.Image, *l.privilegedPlugins...) {
+ return newLinterError(msg, config.File, fmt.Sprintf("%s.%s", area, c.Name), false)
+ } else if l.privilegedPlugins == nil {
+ // if linter has no info of current privileged plugins, it's just a warning
+ return newLinterError(msg, config.File, fmt.Sprintf("%s.%s", area, c.Name), true)
+ }
+ }
+
+ return nil
+}
+
func (l *Linter) lintSettings(config *WorkflowConfig, c *types.Container, field string) error {
if len(c.Settings) == 0 {
return nil
@@ -143,7 +197,10 @@ func (l *Linter) lintSettings(config *WorkflowConfig, c *types.Container, field
return newLinterError("Cannot configure both entrypoint and settings", config.File, fmt.Sprintf("%s.%s", field, c.Name), false)
}
if len(c.Environment) != 0 {
- return newLinterError("Cannot configure both environment and settings", config.File, fmt.Sprintf("%s.%s", field, c.Name), false)
+ return newLinterError("Should not configure both environment and settings", config.File, fmt.Sprintf("%s.%s", field, c.Name), true)
+ }
+ if len(c.Secrets) != 0 {
+ return newLinterError("Should not configure both secrets and settings", config.File, fmt.Sprintf("%s.%s", field, c.Name), true)
}
return nil
}
@@ -151,32 +208,35 @@ func (l *Linter) lintSettings(config *WorkflowConfig, c *types.Container, field
func (l *Linter) lintTrusted(config *WorkflowConfig, c *types.Container, area string) error {
yamlPath := fmt.Sprintf("%s.%s", area, c.Name)
errors := []string{}
- if c.Privileged {
- errors = append(errors, "Insufficient privileges to use privileged mode")
+ if !l.trusted.Security {
+ if c.Privileged {
+ errors = append(errors, "Insufficient privileges to use privileged mode")
+ }
}
- if c.ShmSize != 0 {
- errors = append(errors, "Insufficient privileges to override shm_size")
+ if !l.trusted.Network {
+ if len(c.DNS) != 0 {
+ errors = append(errors, "Insufficient privileges to use custom dns")
+ }
+ if len(c.DNSSearch) != 0 {
+ errors = append(errors, "Insufficient privileges to use dns_search")
+ }
+ if len(c.ExtraHosts) != 0 {
+ errors = append(errors, "Insufficient privileges to use extra_hosts")
+ }
+ if len(c.NetworkMode) != 0 {
+ errors = append(errors, "Insufficient privileges to use network_mode")
+ }
}
- if len(c.DNS) != 0 {
- errors = append(errors, "Insufficient privileges to use custom dns")
- }
- if len(c.DNSSearch) != 0 {
- errors = append(errors, "Insufficient privileges to use dns_search")
- }
- if len(c.Devices) != 0 {
- errors = append(errors, "Insufficient privileges to use devices")
- }
- if len(c.ExtraHosts) != 0 {
- errors = append(errors, "Insufficient privileges to use extra_hosts")
- }
- if len(c.NetworkMode) != 0 {
- errors = append(errors, "Insufficient privileges to use network_mode")
- }
- if c.Volumes.Volumes != nil && len(c.Volumes.Volumes) != 0 {
- errors = append(errors, "Insufficient privileges to use volumes")
- }
- if len(c.Tmpfs) != 0 {
- errors = append(errors, "Insufficient privileges to use tmpfs")
+ if !l.trusted.Volumes {
+ if len(c.Devices) != 0 {
+ errors = append(errors, "Insufficient privileges to use devices")
+ }
+ if len(c.Volumes.Volumes) != 0 {
+ errors = append(errors, "Insufficient privileges to use volumes")
+ }
+ if len(c.Tmpfs) != 0 {
+ errors = append(errors, "Insufficient privileges to use tmpfs")
+ }
}
if len(errors) > 0 {
@@ -215,142 +275,22 @@ func (l *Linter) lintDeprecations(config *WorkflowConfig) (err error) {
return err
}
- if parsed.PipelineDoNotUseIt.ContainerList != nil {
- err = multierr.Append(err, &errorTypes.PipelineError{
- Type: errorTypes.PipelineErrorTypeDeprecation,
- Message: "Please use 'steps:' instead of deprecated 'pipeline:' list",
- Data: errors.DeprecationErrorData{
- File: config.File,
- Field: "pipeline",
- Docs: "https://woodpecker-ci.org/docs/next/migrations#next-200",
- },
- IsWarning: true,
- })
- }
-
- if parsed.PlatformDoNotUseIt != "" {
- err = multierr.Append(err, &errorTypes.PipelineError{
- Type: errorTypes.PipelineErrorTypeDeprecation,
- Message: "Please use labels instead of deprecated 'platform' filters",
- Data: errors.DeprecationErrorData{
- File: config.File,
- Field: "platform",
- Docs: "https://woodpecker-ci.org/docs/next/migrations#next-200",
- },
- IsWarning: true,
- })
- }
-
- if parsed.BranchesDoNotUseIt != nil {
- err = multierr.Append(err, &errorTypes.PipelineError{
- Type: errorTypes.PipelineErrorTypeDeprecation,
- Message: "Please use global when instead of deprecated 'branches' filter",
- Data: errors.DeprecationErrorData{
- File: config.File,
- Field: "branches",
- Docs: "https://woodpecker-ci.org/docs/next/migrations#next-200",
- },
- IsWarning: true,
- })
- }
-
- for _, step := range parsed.Steps.ContainerList {
- if step.Group != "" {
+ for _, container := range parsed.Steps.ContainerList {
+ if len(container.Secrets) > 0 {
err = multierr.Append(err, &errorTypes.PipelineError{
Type: errorTypes.PipelineErrorTypeDeprecation,
- Message: "Please use depends_on instead of deprecated 'group' setting",
+ Message: "Secrets are deprecated, use environment with from_secret",
Data: errors.DeprecationErrorData{
File: config.File,
- Field: "steps." + step.Name + ".group",
- Docs: "https://woodpecker-ci.org/docs/next/usage/workflow-syntax#depends_on",
+ Field: fmt.Sprintf("steps.%s.secrets", container.Name),
+ Docs: "https://woodpecker-ci.org/docs/usage/secrets#usage",
},
IsWarning: true,
})
}
}
- for i, c := range parsed.When.Constraints {
- if len(c.Event.Exclude) != 0 {
- err = multierr.Append(err, &errorTypes.PipelineError{
- Type: errorTypes.PipelineErrorTypeDeprecation,
- Message: "Please only use allow lists for events",
- Data: errors.DeprecationErrorData{
- File: config.File,
- Field: fmt.Sprintf("when[%d].event", i),
- Docs: "https://woodpecker-ci.org/docs/usage/workflow-syntax#event-1",
- },
- IsWarning: true,
- })
- }
- }
-
- for _, step := range parsed.Steps.ContainerList {
- for i, c := range step.When.Constraints {
- if len(c.Event.Exclude) != 0 {
- err = multierr.Append(err, &errorTypes.PipelineError{
- Type: errorTypes.PipelineErrorTypeDeprecation,
- Message: "Please only use allow lists for events",
- Data: errors.DeprecationErrorData{
- File: config.File,
- Field: fmt.Sprintf("steps.%s.when[%d].event", step.Name, i),
- Docs: "https://woodpecker-ci.org/docs/usage/workflow-syntax#event",
- },
- IsWarning: true,
- })
- }
- }
- }
-
- for _, step := range parsed.Steps.ContainerList {
- for i, c := range step.Secrets.Secrets {
- if c.Source != c.Target {
- err = multierr.Append(err, &errorTypes.PipelineError{
- Type: errorTypes.PipelineErrorTypeDeprecation,
- Message: "Secrets alternative names are deprecated, use environment with from_secret",
- Data: errors.DeprecationErrorData{
- File: config.File,
- Field: fmt.Sprintf("steps.%s.secrets[%d]", step.Name, i),
- Docs: "https://woodpecker-ci.org/docs/usage/secrets#use-secrets-in-settings-and-environment",
- },
- IsWarning: true,
- })
- }
- }
- }
-
- for i, c := range parsed.When.Constraints {
- if !c.Environment.IsEmpty() {
- err = multierr.Append(err, &errorTypes.PipelineError{
- Type: errorTypes.PipelineErrorTypeDeprecation,
- Message: "environment filters are deprecated, use evaluate with CI_PIPELINE_DEPLOY_TARGET",
- Data: errors.DeprecationErrorData{
- File: config.File,
- Field: fmt.Sprintf("when[%d].environment", i),
- Docs: "https://woodpecker-ci.org/docs/usage/workflow-syntax#evaluate",
- },
- IsWarning: true,
- })
- }
- }
-
- for _, step := range parsed.Steps.ContainerList {
- for i, c := range step.When.Constraints {
- if !c.Environment.IsEmpty() {
- err = multierr.Append(err, &errorTypes.PipelineError{
- Type: errorTypes.PipelineErrorTypeDeprecation,
- Message: "environment filters are deprecated, use evaluate with CI_PIPELINE_DEPLOY_TARGET",
- Data: errors.DeprecationErrorData{
- File: config.File,
- Field: fmt.Sprintf("steps.%s.when[%d].environment", step.Name, i),
- Docs: "https://woodpecker-ci.org/docs/usage/workflow-syntax#evaluate",
- },
- IsWarning: true,
- })
- }
- }
- }
-
- return err
+ return nil
}
func (l *Linter) lintBadHabits(config *WorkflowConfig) (err error) {
@@ -362,7 +302,7 @@ func (l *Linter) lintBadHabits(config *WorkflowConfig) (err error) {
rootEventFilters := len(parsed.When.Constraints) > 0
for _, c := range parsed.When.Constraints {
- if len(c.Event.Include) == 0 {
+ if len(c.Event) == 0 {
rootEventFilters = false
break
}
@@ -376,7 +316,7 @@ func (l *Linter) lintBadHabits(config *WorkflowConfig) (err error) {
} else {
stepEventIndex := -1
for i, c := range step.When.Constraints {
- if len(c.Event.Include) == 0 {
+ if len(c.Event) == 0 {
stepEventIndex = i
break
}
diff --git a/pipeline/frontend/yaml/linter/linter_test.go b/pipeline/frontend/yaml/linter/linter_test.go
index 5f73d89ac..943cd5593 100644
--- a/pipeline/frontend/yaml/linter/linter_test.go
+++ b/pipeline/frontend/yaml/linter/linter_test.go
@@ -39,7 +39,7 @@ steps:
- go build
- go test
publish:
- image: plugins/docker
+ image: woodpeckerci/plugin-kaniko
settings:
repo: foo/bar
foo: bar
@@ -61,7 +61,7 @@ steps:
- go build
- go test
- name: publish
- image: plugins/docker
+ image: woodpeckerci/plugin-kaniko
settings:
repo: foo/bar
foo: bar
@@ -94,7 +94,11 @@ steps:
conf, err := yaml.ParseString(testd.Data)
assert.NoError(t, err)
- assert.NoError(t, linter.New(linter.WithTrusted(true)).Lint([]*linter.WorkflowConfig{{
+ assert.NoError(t, linter.New(linter.WithTrusted(linter.TrustedConfiguration{
+ Network: true,
+ Volumes: true,
+ Security: true,
+ })).Lint([]*linter.WorkflowConfig{{
File: testd.Title,
RawConfig: testd.Data,
Workflow: conf,
@@ -120,10 +124,6 @@ func TestLintErrors(t *testing.T) {
from: "steps: { build: { image: golang, privileged: true } }",
want: "Insufficient privileges to use privileged mode",
},
- {
- from: "steps: { build: { image: golang, shm_size: 10gb } }",
- want: "Insufficient privileges to override shm_size",
- },
{
from: "steps: { build: { image: golang, dns: [ 8.8.8.8 ] } }",
want: "Insufficient privileges to use custom dns",
@@ -162,8 +162,20 @@ func TestLintErrors(t *testing.T) {
want: "Cannot configure both entrypoint and settings",
},
{
- from: "steps: { build: { image: golang, settings: { test: 'true' }, environment: [ 'TEST=true' ] } }",
- want: "Cannot configure both environment and settings",
+ from: "steps: { build: { image: golang, settings: { test: 'true' }, environment: { 'TEST': 'true' } } }",
+ want: "Should not configure both environment and settings",
+ },
+ {
+ from: "{pipeline: { build: { image: golang, settings: { test: 'true' } } }, when: { branch: main, event: push } }",
+ want: "Additional property pipeline is not allowed",
+ },
+ {
+ from: "{steps: { build: { image: plugins/docker, settings: { test: 'true' } } }, when: { branch: main, event: push } } }",
+ want: "The formerly privileged plugin 'plugins/docker' is no longer privileged by default, if required, add it to WOODPECKER_PLUGINS_PRIVILEGED",
+ },
+ {
+ from: "{steps: { build: { image: golang, settings: { test: 'true' } } }, when: { branch: main, event: push }, clone: { git: { image: some-other/plugin-git:v1.1.0 } } }",
+ want: "Specified clone image does not match allow list, netrc will not be injected",
},
}
diff --git a/pipeline/frontend/yaml/linter/option.go b/pipeline/frontend/yaml/linter/option.go
index 0fe2af76f..5c297152a 100644
--- a/pipeline/frontend/yaml/linter/option.go
+++ b/pipeline/frontend/yaml/linter/option.go
@@ -18,8 +18,22 @@ package linter
type Option func(*Linter)
// WithTrusted adds the trusted option to the linter.
-func WithTrusted(trusted bool) Option {
+func WithTrusted(trusted TrustedConfiguration) Option {
return func(linter *Linter) {
linter.trusted = trusted
}
}
+
+// PrivilegedPlugins adds the list of privileged plugins.
+func PrivilegedPlugins(plugins []string) Option {
+ return func(linter *Linter) {
+ linter.privilegedPlugins = &plugins
+ }
+}
+
+// WithTrustedClonePlugins adds the list of trusted clone plugins.
+func WithTrustedClonePlugins(plugins []string) Option {
+ return func(linter *Linter) {
+ linter.trustedClonePlugins = &plugins
+ }
+}
diff --git a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-array-syntax.yaml b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-array-syntax.yaml
index a21b77261..569e5529c 100644
--- a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-array-syntax.yaml
+++ b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-array-syntax.yaml
@@ -1,5 +1,3 @@
-version: 1
-
clone:
- name: git
image: woodpeckerci/plugin-git
diff --git a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-branches-array.yaml b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-branches-array.yaml
deleted file mode 100644
index d530db055..000000000
--- a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-branches-array.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-branches: [main, pages]
-
-steps:
- build:
- image: golang
- commands:
- - go test
diff --git a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-branches-exclude-include.yaml b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-branches-exclude-include.yaml
deleted file mode 100644
index 03b534d23..000000000
--- a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-branches-exclude-include.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-branches:
- include: main
- exclude: [develop, feature/*]
-
-steps:
- build:
- image: golang
- commands:
- - go test
diff --git a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-branches.yaml b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-branches.yaml
deleted file mode 100644
index 75b72bbcf..000000000
--- a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-branches.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-branches: main
-
-steps:
- build:
- image: golang
- commands:
- - go test
diff --git a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-platform.yaml b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-platform.yaml
deleted file mode 100644
index 7b4abf027..000000000
--- a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-platform.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-platform: linux/amd64
-
-steps:
- build:
- image: golang:latest
- commands:
- - go test
diff --git a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-service.yaml b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-service.yaml
index 03564e9fc..16429df75 100644
--- a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-service.yaml
+++ b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-service.yaml
@@ -10,3 +10,4 @@ services:
image: mysql
cache:
image: redis
+ directory: /tmp/
diff --git a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-step.yaml b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-step.yaml
index 9f60fcf44..da6ada4f2 100644
--- a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-step.yaml
+++ b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-step.yaml
@@ -38,15 +38,6 @@ steps:
commands:
- go test
- environment-array:
- image: golang
- environment:
- - CGO=0
- - GOOS=linux
- - GOARCH=amd64
- commands:
- - go test
-
secrets:
image: docker
commands:
@@ -54,14 +45,7 @@ steps:
- echo $DOCKER_PASSWORD
secrets:
- docker_username
- - source: docker_prod_password
- target: docker_password
-
- group:
- group: test
- image: golang
- commands:
- - go test
+ - docker_prod_password
detached:
image: redis
diff --git a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-when.yaml b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-when.yaml
index b08385a77..a8235b65e 100644
--- a/pipeline/frontend/yaml/linter/schema/.woodpecker/test-when.yaml
+++ b/pipeline/frontend/yaml/linter/schema/.woodpecker/test-when.yaml
@@ -19,6 +19,9 @@ steps:
- echo "test"
when:
event: push
+ branch:
+ include: main
+ exclude: [develop, feature/*]
when-event-array:
image: alpine
@@ -34,14 +37,6 @@ steps:
- deployment
- release
- when-event-exclude-pull_request_closed:
- image: alpine
- commands:
- - echo "test"
- when:
- event:
- exclude: pull_request_closed
-
when-ref:
image: alpine
commands:
@@ -75,7 +70,6 @@ steps:
commands:
- echo "test"
when:
- environment: production
event: deployment
when-matrix:
diff --git a/pipeline/frontend/yaml/linter/schema/schema.json b/pipeline/frontend/yaml/linter/schema/schema.json
index 5a85cf320..6128ce15b 100644
--- a/pipeline/frontend/yaml/linter/schema/schema.json
+++ b/pipeline/frontend/yaml/linter/schema/schema.json
@@ -20,19 +20,12 @@
"skip_clone": {
"type": "boolean"
},
- "branches": {
- "$ref": "#/definitions/branches"
- },
"when": {
- "$ref": "#/definitions/pipeline_when"
+ "$ref": "#/definitions/workflow_when"
},
"steps": {
"$ref": "#/definitions/step_list"
},
- "pipeline": {
- "$ref": "#/definitions/step_list",
- "description": "deprecated, use steps"
- },
"services": {
"$ref": "#/definitions/services"
},
@@ -42,9 +35,6 @@
"matrix": {
"$ref": "#/definitions/matrix"
},
- "platform": {
- "$ref": "#/definitions/platform"
- },
"labels": {
"$ref": "#/definitions/labels"
},
@@ -61,10 +51,6 @@
"items": {
"type": "string"
}
- },
- "version": {
- "type": "number",
- "default": 1
}
},
"definitions": {
@@ -128,55 +114,6 @@
"type": ["boolean", "string", "number", "array", "object"]
}
},
- "branches": {
- "description": "deprecated, use when.branch",
- "oneOf": [
- {
- "type": "array",
- "items": {
- "type": "string"
- },
- "minProperties": 1
- },
- {
- "type": "string"
- },
- {
- "type": "object",
- "additionalProperties": false,
- "properties": {
- "exclude": {
- "oneOf": [
- {
- "type": "array",
- "items": {
- "type": "string"
- },
- "minLength": 1
- },
- {
- "type": "string"
- }
- ]
- },
- "include": {
- "oneOf": [
- {
- "type": "array",
- "items": {
- "type": "string"
- },
- "minLength": 1
- },
- {
- "type": "string"
- }
- ]
- }
- }
- }
- ]
- },
"step_list": {
"description": "The steps section defines a list of steps which will be executed serially, in the order in which they are defined. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#steps",
"oneOf": [
@@ -196,22 +133,22 @@
}
]
},
- "pipeline_when": {
- "description": "Whole pipelines can be skipped based on conditions. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#when---global-workflow-conditions",
+ "workflow_when": {
+ "description": "Whole workflow can be skipped based on conditions. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#when---global-workflow-conditions",
"oneOf": [
{
"type": "array",
"minLength": 1,
"items": {
- "$ref": "#/definitions/pipeline_when_condition"
+ "$ref": "#/definitions/workflow_when_condition"
}
},
{
- "$ref": "#/definitions/pipeline_when_condition"
+ "$ref": "#/definitions/workflow_when_condition"
}
]
},
- "pipeline_when_condition": {
+ "workflow_when_condition": {
"type": "object",
"additionalProperties": false,
"properties": {
@@ -226,18 +163,7 @@
"event": {
"description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#event",
"default": [],
- "oneOf": [
- {
- "type": "array",
- "minLength": 1,
- "items": {
- "$ref": "#/definitions/event_enum"
- }
- },
- {
- "$ref": "#/definitions/event_enum"
- }
- ]
+ "$ref": "#/definitions/event_constraint_list"
},
"ref": {
"description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#ref",
@@ -251,10 +177,6 @@
"description": "Execute a step only on a specific platform. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#platform",
"$ref": "#/definitions/constraint_list"
},
- "environment": {
- "description": "Execute a step only for a specific environment. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#environment",
- "$ref": "#/definitions/constraint_list"
- },
"instance": {
"description": "Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#instance",
"$ref": "#/definitions/constraint_list"
@@ -305,13 +227,10 @@
},
"step": {
"description": "A step of your workflow executes either arbitrary commands or uses a plugin. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#steps",
- "oneOf": [
+ "anyOf": [
{
"$ref": "#/definitions/commands_step"
},
- {
- "$ref": "#/definitions/entrypoint_step"
- },
{
"$ref": "#/definitions/plugin_step"
}
@@ -321,93 +240,29 @@
"description": "Every step of your pipeline executes arbitrary commands inside a specified docker container. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#steps",
"type": "object",
"additionalProperties": false,
- "required": ["image", "commands"],
- "properties": {
- "name": {
- "description": "The name of the step. Can be used if using the array style steps list.",
- "type": "string"
- },
- "image": {
- "$ref": "#/definitions/step_image"
- },
- "privileged": {
- "$ref": "#/definitions/step_privileged"
- },
- "pull": {
- "$ref": "#/definitions/step_pull"
- },
- "commands": {
- "$ref": "#/definitions/step_commands"
- },
- "environment": {
- "$ref": "#/definitions/step_environment"
- },
- "directory": {
- "$ref": "#/definitions/step_directory"
- },
- "secrets": {
- "$ref": "#/definitions/step_secrets"
- },
- "when": {
- "$ref": "#/definitions/step_when"
- },
- "volumes": {
- "$ref": "#/definitions/step_volumes"
- },
- "group": {
- "description": "deprecated, use depends_on",
- "type": "string"
- },
- "depends_on": {
- "description": "Execute a step after another step has finished.",
- "oneOf": [
- {
- "type": "array",
- "minLength": 1,
- "items": {
- "type": "string"
+ "required": ["image"],
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "detach": {
+ "const": true
}
- },
- {
- "type": "string"
}
- ]
- },
- "detach": {
- "description": "Detach a step to run in background until pipeline finishes. Read more: https://woodpecker-ci.org/docs/usage/services#detachment",
- "type": "boolean"
- },
- "failure": {
- "description": "How to handle the failure of this step. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#failure",
- "type": "string",
- "enum": ["fail", "ignore"],
- "default": "fail"
- },
- "backend_options": {
- "$ref": "#/definitions/step_backend_options"
- },
- "entrypoint": {
- "description": "Defines container entrypoint.",
- "oneOf": [
- {
- "type": "array",
- "minLength": 1,
- "items": {
- "type": "string"
+ },
+ "then": {},
+ "else": {
+ "anyOf": [
+ {
+ "required": ["commands"]
+ },
+ {
+ "required": ["entrypoint"]
}
- },
- {
- "type": "string"
- }
- ]
+ ]
+ }
}
- }
- },
- "entrypoint_step": {
- "description": "Every step of your pipeline executes arbitrary commands inside a specified docker container. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#steps",
- "type": "object",
- "additionalProperties": false,
- "required": ["image", "entrypoint"],
+ ],
"properties": {
"name": {
"description": "The name of the step. Can be used if using the array style steps list.",
@@ -440,10 +295,6 @@
"volumes": {
"$ref": "#/definitions/step_volumes"
},
- "group": {
- "description": "deprecated, use depends_on",
- "type": "string"
- },
"depends_on": {
"description": "Execute a step after another step has finished.",
"oneOf": [
@@ -511,9 +362,6 @@
"directory": {
"$ref": "#/definitions/step_directory"
},
- "secrets": {
- "$ref": "#/definitions/step_secrets"
- },
"settings": {
"$ref": "#/definitions/step_settings"
},
@@ -523,10 +371,6 @@
"volumes": {
"$ref": "#/definitions/step_volumes"
},
- "group": {
- "description": "deprecated, use depends_on",
- "type": "string"
- },
"depends_on": {
"description": "Execute a step after another step has finished.",
"oneOf": [
@@ -617,10 +461,6 @@
"description": "Execute a step only on a specific platform. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#platform",
"$ref": "#/definitions/constraint_list"
},
- "environment": {
- "description": "Execute a step only for a specific environment. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#environment",
- "$ref": "#/definitions/constraint_list"
- },
"matrix": {
"description": "Read more: https://woodpecker-ci.org/docs/usage/matrix-workflows",
"type": "object",
@@ -690,40 +530,6 @@
"items": {
"$ref": "#/definitions/event_enum"
}
- },
- {
- "type": "object",
- "additionalProperties": false,
- "properties": {
- "include": {
- "oneOf": [
- {
- "$ref": "#/definitions/event_enum"
- },
- {
- "type": "array",
- "minLength": 1,
- "items": {
- "$ref": "#/definitions/event_enum"
- }
- }
- ]
- },
- "exclude": {
- "oneOf": [
- {
- "$ref": "#/definitions/event_enum"
- },
- {
- "type": "array",
- "minLength": 1,
- "items": {
- "$ref": "#/definitions/event_enum"
- }
- }
- ]
- }
- }
}
]
},
@@ -805,43 +611,16 @@
},
"step_environment": {
"description": "Pass environment variables to a pipeline step. Read more: https://woodpecker-ci.org/docs/usage/environment",
- "oneOf": [
- {
- "type": "array",
- "items": {
- "type": "string"
- },
- "minLength": 1
- },
- {
- "type": "object",
- "additionalProperties": {
- "type": ["boolean", "string", "number", "array", "object"]
- }
- }
- ]
+ "type": "object",
+ "additionalProperties": {
+ "type": ["boolean", "string", "number", "array", "object"]
+ }
},
"step_secrets": {
"description": "Pass secrets to a pipeline step at runtime. Read more: https://woodpecker-ci.org/docs/usage/secrets",
"type": "array",
"items": {
- "oneOf": [
- {
- "type": "string"
- },
- {
- "type": "object",
- "required": ["source", "target"],
- "properties": {
- "source": {
- "type": "string"
- },
- "target": {
- "type": "string"
- }
- }
- }
- ]
+ "type": "string"
},
"minLength": 1
},
@@ -1063,6 +842,9 @@
"environment": {
"$ref": "#/definitions/step_environment"
},
+ "directory": {
+ "$ref": "#/definitions/step_directory"
+ },
"secrets": {
"$ref": "#/definitions/step_secrets"
},
@@ -1120,11 +902,6 @@
"minLength": 1
}
},
- "platform": {
- "description": "deprecated, use labels.platform",
- "type": "string",
- "additionalProperties": false
- },
"labels": {
"description": "Configures the labels used for the agent selection. Read more: https://woodpecker-ci.org/docs/usage/workflow-syntax#labels",
"type": "object",
diff --git a/pipeline/frontend/yaml/linter/schema/schema_test.go b/pipeline/frontend/yaml/linter/schema/schema_test.go
index be5dfe2ae..2a5526e24 100644
--- a/pipeline/frontend/yaml/linter/schema/schema_test.go
+++ b/pipeline/frontend/yaml/linter/schema/schema_test.go
@@ -32,18 +32,6 @@ func TestSchema(t *testing.T) {
testFile string
fail bool
}{
- {
- name: "Branches",
- testFile: ".woodpecker/test-branches.yaml",
- },
- {
- name: "Branches Array",
- testFile: ".woodpecker/test-branches-array.yaml",
- },
- {
- name: "Branches exclude & include",
- testFile: ".woodpecker/test-branches-exclude-include.yaml",
- },
{
name: "Clone",
testFile: ".woodpecker/test-clone.yaml",
@@ -84,10 +72,6 @@ func TestSchema(t *testing.T) {
name: "Workspace",
testFile: ".woodpecker/test-workspace.yaml",
},
- {
- name: "Platform",
- testFile: ".woodpecker/test-platform.yaml",
- },
{
name: "Labels",
testFile: ".woodpecker/test-labels.yaml",
diff --git a/pipeline/frontend/yaml/parse.go b/pipeline/frontend/yaml/parse.go
index 8607dd537..e9a6255fe 100644
--- a/pipeline/frontend/yaml/parse.go
+++ b/pipeline/frontend/yaml/parse.go
@@ -15,11 +15,8 @@
package yaml
import (
- "fmt"
-
"codeberg.org/6543/xyaml"
- "go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/constraint"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/types"
)
@@ -30,37 +27,6 @@ func ParseBytes(b []byte) (*types.Workflow, error) {
if err != nil {
return nil, err
}
-
- // support deprecated branch filter
- if out.BranchesDoNotUseIt != nil {
- switch {
- case out.When.Constraints == nil:
- out.When.Constraints = []constraint.Constraint{{Branch: *out.BranchesDoNotUseIt}}
- case len(out.When.Constraints) == 1 && out.When.Constraints[0].Branch.IsEmpty():
- out.When.Constraints[0].Branch = *out.BranchesDoNotUseIt
- default:
- return nil, fmt.Errorf("could not apply deprecated branches filter into global when filter")
- }
- out.BranchesDoNotUseIt = nil
- }
-
- // support deprecated pipeline keyword
- if len(out.PipelineDoNotUseIt.ContainerList) != 0 && len(out.Steps.ContainerList) == 0 {
- out.Steps.ContainerList = out.PipelineDoNotUseIt.ContainerList
- }
-
- // support deprecated platform filter
- if out.PlatformDoNotUseIt != "" {
- if out.Labels == nil {
- out.Labels = make(map[string]string)
- }
- if _, set := out.Labels["platform"]; !set {
- out.Labels["platform"] = out.PlatformDoNotUseIt
- }
- out.PlatformDoNotUseIt = ""
- }
- out.PipelineDoNotUseIt.ContainerList = nil
-
return out, nil
}
diff --git a/pipeline/frontend/yaml/parse_test.go b/pipeline/frontend/yaml/parse_test.go
index 5402cd03c..3dec23cd1 100644
--- a/pipeline/frontend/yaml/parse_test.go
+++ b/pipeline/frontend/yaml/parse_test.go
@@ -15,6 +15,7 @@
package yaml
import (
+ "slices"
"testing"
"github.com/franela/goblin"
@@ -35,7 +36,7 @@ func TestParse(t *testing.T) {
g.Fail(err)
}
- g.Assert(out.When.Constraints[0].Event.Match("tester")).Equal(true)
+ g.Assert(slices.Contains(out.When.Constraints[0].Event, "tester")).Equal(true)
g.Assert(out.Workspace.Base).Equal("/go")
g.Assert(out.Workspace.Path).Equal("src/github.com/octocat/hello-world")
@@ -85,7 +86,7 @@ func TestParse(t *testing.T) {
g.Assert(len(out.Steps.ContainerList[0].When.Constraints)).Equal(0)
g.Assert(out.Steps.ContainerList[1].Name).Equal("notify_success")
g.Assert(out.Steps.ContainerList[1].Image).Equal("plugins/slack")
- g.Assert(out.Steps.ContainerList[1].When.Constraints[0].Event.Include).Equal([]string{"success"})
+ g.Assert(out.Steps.ContainerList[1].When.Constraints[0].Event).Equal(yaml_base_types.StringOrSlice{"success"})
})
matchConfig, err := ParseString(sampleYaml)
@@ -139,10 +140,11 @@ func TestParse(t *testing.T) {
}
func TestParseLegacy(t *testing.T) {
- sampleYamlPipelineLegacy := `
-platform: linux/amd64
+ sampleYamlPipeline := `
+labels:
+ platform: linux/amd64
-pipeline:
+steps:
say hello:
image: bash
commands: echo hello
@@ -164,7 +166,7 @@ pipeline:
commands: meh!
`
- workflow1, err := ParseString(sampleYamlPipelineLegacy)
+ workflow1, err := ParseString(sampleYamlPipeline)
if !assert.NoError(t, err) {
return
}
diff --git a/pipeline/frontend/yaml/types/base/map.go b/pipeline/frontend/yaml/types/base/map.go
deleted file mode 100644
index 2cdd35b8b..000000000
--- a/pipeline/frontend/yaml/types/base/map.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2023 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package base
-
-import (
- "errors"
- "fmt"
- "strings"
-)
-
-// SliceOrMap represents a map of strings, string slice are converted into a map.
-type SliceOrMap map[string]any
-
-// UnmarshalYAML implements the Unmarshaler interface.
-func (s *SliceOrMap) UnmarshalYAML(unmarshal func(any) error) error {
- var sliceType []any
- if err := unmarshal(&sliceType); err == nil {
- parts := map[string]any{}
- for _, s := range sliceType {
- if str, ok := s.(string); ok {
- str := strings.TrimSpace(str)
- key, val, _ := strings.Cut(str, "=")
- parts[key] = val
- } else {
- return fmt.Errorf("cannot unmarshal '%v' of type %T into a string value", s, s)
- }
- }
- *s = parts
- return nil
- }
-
- var mapType map[string]any
- if err := unmarshal(&mapType); err == nil {
- *s = mapType
- return nil
- }
-
- return errors.New("failed to unmarshal SliceOrMap")
-}
diff --git a/pipeline/frontend/yaml/types/base/map_test.go b/pipeline/frontend/yaml/types/base/map_test.go
deleted file mode 100644
index 750fd1714..000000000
--- a/pipeline/frontend/yaml/types/base/map_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2024 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package base
-
-import (
- "testing"
-
- "github.com/stretchr/testify/assert"
- "gopkg.in/yaml.v3"
-)
-
-type StructSliceOrMap struct {
- Foos SliceOrMap `yaml:"foos,omitempty"`
- Bars []string `yaml:"bars"`
-}
-
-func TestSliceOrMapYaml(t *testing.T) {
- str := `{foos: [bar=baz, far=faz]}`
-
- s := StructSliceOrMap{}
- assert.NoError(t, yaml.Unmarshal([]byte(str), &s))
-
- assert.Equal(t, SliceOrMap{"bar": "baz", "far": "faz"}, s.Foos)
-
- d, err := yaml.Marshal(&s)
- assert.NoError(t, err)
-
- s2 := StructSliceOrMap{}
- assert.NoError(t, yaml.Unmarshal(d, &s2))
-
- assert.Equal(t, SliceOrMap{"bar": "baz", "far": "faz"}, s2.Foos)
-}
-
-func TestStr2SliceOrMapPtrMap(t *testing.T) {
- s := map[string]*StructSliceOrMap{"udav": {
- Foos: SliceOrMap{"io.rancher.os.bar": "baz", "io.rancher.os.far": "true"},
- Bars: []string{},
- }}
- d, err := yaml.Marshal(&s)
- assert.NoError(t, err)
-
- s2 := map[string]*StructSliceOrMap{}
- assert.NoError(t, yaml.Unmarshal(d, &s2))
-
- assert.Equal(t, s, s2)
-}
diff --git a/pipeline/frontend/yaml/types/container.go b/pipeline/frontend/yaml/types/container.go
index 40d7385f8..8d2bbbf64 100644
--- a/pipeline/frontend/yaml/types/container.go
+++ b/pipeline/frontend/yaml/types/container.go
@@ -22,7 +22,6 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/constraint"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/types/base"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/utils"
- "go.woodpecker-ci.org/woodpecker/v2/shared/constant"
)
type (
@@ -39,7 +38,6 @@ type (
Detached bool `yaml:"detach,omitempty"`
Directory string `yaml:"directory,omitempty"`
Failure string `yaml:"failure,omitempty"`
- Group string `yaml:"group,omitempty"`
Image string `yaml:"image,omitempty"`
Name string `yaml:"name,omitempty"`
Pull bool `yaml:"pull,omitempty"`
@@ -49,27 +47,21 @@ type (
Ports []string `yaml:"ports,omitempty"`
DependsOn base.StringOrSlice `yaml:"depends_on,omitempty"`
- // TODO: make []string in 3.x
- Secrets Secrets `yaml:"secrets,omitempty"`
- // TODO: make map[string]any in 3.x
- Environment base.SliceOrMap `yaml:"environment,omitempty"`
+ Environment map[string]any `yaml:"environment,omitempty"`
+
+ // Deprecated
+ Secrets []string `yaml:"secrets,omitempty"`
// Docker and Kubernetes Specific
Privileged bool `yaml:"privileged,omitempty"`
// Undocumented
- CPUQuota base.StringOrInt `yaml:"cpu_quota,omitempty"`
- CPUSet string `yaml:"cpuset,omitempty"`
- CPUShares base.StringOrInt `yaml:"cpu_shares,omitempty"`
- Devices []string `yaml:"devices,omitempty"`
- DNSSearch base.StringOrSlice `yaml:"dns_search,omitempty"`
- DNS base.StringOrSlice `yaml:"dns,omitempty"`
- ExtraHosts []string `yaml:"extra_hosts,omitempty"`
- MemLimit base.MemStringOrInt `yaml:"mem_limit,omitempty"`
- MemSwapLimit base.MemStringOrInt `yaml:"memswap_limit,omitempty"`
- NetworkMode string `yaml:"network_mode,omitempty"`
- ShmSize base.MemStringOrInt `yaml:"shm_size,omitempty"`
- Tmpfs []string `yaml:"tmpfs,omitempty"`
+ Devices []string `yaml:"devices,omitempty"`
+ DNSSearch base.StringOrSlice `yaml:"dns_search,omitempty"`
+ DNS base.StringOrSlice `yaml:"dns,omitempty"`
+ ExtraHosts []string `yaml:"extra_hosts,omitempty"`
+ NetworkMode string `yaml:"network_mode,omitempty"`
+ Tmpfs []string `yaml:"tmpfs,omitempty"`
}
)
@@ -124,9 +116,10 @@ func (c *ContainerList) UnmarshalYAML(value *yaml.Node) error {
func (c *Container) IsPlugin() bool {
return len(c.Commands) == 0 &&
len(c.Entrypoint) == 0 &&
- len(c.Environment) == 0
+ len(c.Environment) == 0 &&
+ len(c.Secrets) == 0
}
-func (c *Container) IsTrustedCloneImage() bool {
- return c.IsPlugin() && utils.MatchImage(c.Image, constant.TrustedCloneImages...)
+func (c *Container) IsTrustedCloneImage(trustedClonePlugins []string) bool {
+ return c.IsPlugin() && utils.MatchImageDynamic(c.Image, trustedClonePlugins...)
}
diff --git a/pipeline/frontend/yaml/types/container_test.go b/pipeline/frontend/yaml/types/container_test.go
index 3573fbc13..eaa5ca918 100644
--- a/pipeline/frontend/yaml/types/container_test.go
+++ b/pipeline/frontend/yaml/types/container_test.go
@@ -30,9 +30,6 @@ image: golang:latest
commands:
- go build
- go test
-cpu_quota: 11
-cpuset: 1,2
-cpu_shares: 99
detach: true
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
@@ -41,8 +38,8 @@ dns: 8.8.8.8
dns_search: example.com
entrypoint: [/bin/sh, -c]
environment:
- - RACK_ENV=development
- - SHOW=true
+ RACK_ENV: development
+ SHOW: true
extra_hosts:
- somehost:162.242.195.82
- otherhost:50.31.209.229
@@ -54,9 +51,6 @@ networks:
- other-network
pull: true
privileged: true
-shm_size: 1kb
-mem_limit: 1kb
-memswap_limit: 1kb
volumes:
- /var/lib/mysql
- /opt/data:/var/lib/mysql
@@ -78,27 +72,21 @@ ports:
func TestUnmarshalContainer(t *testing.T) {
want := Container{
- Commands: base.StringOrSlice{"go build", "go test"},
- CPUQuota: base.StringOrInt(11),
- CPUSet: "1,2",
- CPUShares: base.StringOrInt(99),
- Detached: true,
- Devices: []string{"/dev/ttyUSB0:/dev/ttyUSB0"},
- Directory: "example/",
- DNS: base.StringOrSlice{"8.8.8.8"},
- DNSSearch: base.StringOrSlice{"example.com"},
- Entrypoint: []string{"/bin/sh", "-c"},
- Environment: base.SliceOrMap{"RACK_ENV": "development", "SHOW": "true"},
- ExtraHosts: []string{"somehost:162.242.195.82", "otherhost:50.31.209.229", "ipv6:2001:db8::10"},
- Image: "golang:latest",
- MemLimit: base.MemStringOrInt(1024),
- MemSwapLimit: base.MemStringOrInt(1024),
- Name: "my-build-container",
- NetworkMode: "bridge",
- Pull: true,
- Privileged: true,
- ShmSize: base.MemStringOrInt(1024),
- Tmpfs: base.StringOrSlice{"/var/lib/test"},
+ Commands: base.StringOrSlice{"go build", "go test"},
+ Detached: true,
+ Devices: []string{"/dev/ttyUSB0:/dev/ttyUSB0"},
+ Directory: "example/",
+ DNS: base.StringOrSlice{"8.8.8.8"},
+ DNSSearch: base.StringOrSlice{"example.com"},
+ Entrypoint: []string{"/bin/sh", "-c"},
+ Environment: map[string]any{"RACK_ENV": "development", "SHOW": true},
+ ExtraHosts: []string{"somehost:162.242.195.82", "otherhost:50.31.209.229", "ipv6:2001:db8::10"},
+ Image: "golang:latest",
+ Name: "my-build-container",
+ NetworkMode: "bridge",
+ Pull: true,
+ Privileged: true,
+ Tmpfs: base.StringOrSlice{"/var/lib/test"},
Volumes: Volumes{
Volumes: []*Volume{
{Source: "", Destination: "/var/lib/mysql"},
@@ -114,9 +102,7 @@ func TestUnmarshalContainer(t *testing.T) {
},
},
{
- Event: constraint.List{
- Include: []string{"cron"},
- },
+ Event: base.StringOrSlice{"cron"},
Cron: constraint.List{
Include: []string{"job1"},
},
@@ -166,7 +152,6 @@ func TestUnmarshalContainers(t *testing.T) {
},
{
from: `publish-agent:
- group: bundle
image: print/env
settings:
repo: woodpeckerci/woodpecker-agent
@@ -179,16 +164,9 @@ func TestUnmarshalContainers(t *testing.T) {
event: push`,
want: []*Container{
{
- Name: "publish-agent",
- Image: "print/env",
- Group: "bundle",
- Secrets: Secrets{Secrets: []*Secret{{
- Source: "docker_username",
- Target: "docker_username",
- }, {
- Source: "docker_password",
- Target: "docker_password",
- }}},
+ Name: "publish-agent",
+ Image: "print/env",
+ Secrets: []string{"docker_username", "docker_password"},
Settings: map[string]any{
"repo": "woodpeckerci/woodpecker-agent",
"dockerfile": "docker/Dockerfile.agent",
@@ -198,7 +176,7 @@ func TestUnmarshalContainers(t *testing.T) {
When: constraint.When{
Constraints: []constraint.Constraint{
{
- Event: constraint.List{Include: []string{"push"}},
+ Event: base.StringOrSlice{"push"},
Branch: constraint.List{Include: []string{"${CI_REPO_DEFAULT_BRANCH}"}},
},
},
@@ -208,7 +186,6 @@ func TestUnmarshalContainers(t *testing.T) {
},
{
from: `publish-cli:
- group: docker
image: print/env
settings:
repo: woodpeckerci/woodpecker-cli
@@ -221,7 +198,6 @@ func TestUnmarshalContainers(t *testing.T) {
{
Name: "publish-cli",
Image: "print/env",
- Group: "docker",
Settings: map[string]any{
"repo": "woodpeckerci/woodpecker-cli",
"dockerfile": "docker/Dockerfile.cli",
@@ -230,7 +206,7 @@ func TestUnmarshalContainers(t *testing.T) {
When: constraint.When{
Constraints: []constraint.Constraint{
{
- Event: constraint.List{Include: []string{"push"}},
+ Event: base.StringOrSlice{"push"},
Branch: constraint.List{Include: []string{"${CI_REPO_DEFAULT_BRANCH}"}},
},
},
@@ -252,11 +228,11 @@ func TestUnmarshalContainers(t *testing.T) {
When: constraint.When{
Constraints: []constraint.Constraint{
{
- Event: constraint.List{Include: []string{"push"}},
+ Event: base.StringOrSlice{"push"},
Branch: constraint.List{Include: []string{"${CI_REPO_DEFAULT_BRANCH}"}},
},
{
- Event: constraint.List{Include: []string{"pull_request"}},
+ Event: base.StringOrSlice{"pull_request"},
},
},
},
diff --git a/pipeline/frontend/yaml/types/secret.go b/pipeline/frontend/yaml/types/secret.go
deleted file mode 100644
index 9958b41aa..000000000
--- a/pipeline/frontend/yaml/types/secret.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2023 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package types
-
-import "gopkg.in/yaml.v3"
-
-type (
- // Secrets defines a collection of secrets.
- Secrets struct {
- Secrets []*Secret
- }
-
- // Secret defines a container secret.
- Secret struct {
- Source string `yaml:"source"`
- Target string `yaml:"target"`
- }
-)
-
-// UnmarshalYAML implements the Unmarshaler interface.
-func (s *Secrets) UnmarshalYAML(value *yaml.Node) error {
- y, _ := yaml.Marshal(value)
-
- var secrets []string
- err := yaml.Unmarshal(y, &secrets)
- if err == nil {
- for _, str := range secrets {
- s.Secrets = append(s.Secrets, &Secret{
- Source: str,
- Target: str,
- })
- }
- return nil
- }
- return yaml.Unmarshal(y, &s.Secrets)
-}
diff --git a/pipeline/frontend/yaml/types/secret_test.go b/pipeline/frontend/yaml/types/secret_test.go
deleted file mode 100644
index fcfc6d212..000000000
--- a/pipeline/frontend/yaml/types/secret_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2023 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package types
-
-import (
- "testing"
-
- "github.com/stretchr/testify/assert"
- "gopkg.in/yaml.v3"
-)
-
-func TestUnmarshalSecrets(t *testing.T) {
- testdata := []struct {
- from string
- want []*Secret
- }{
- {
- from: "[ mysql_username, mysql_password]",
- want: []*Secret{
- {
- Source: "mysql_username",
- Target: "mysql_username",
- },
- {
- Source: "mysql_password",
- Target: "mysql_password",
- },
- },
- },
- {
- from: "[ { source: mysql_prod_username, target: mysql_username } ]",
- want: []*Secret{
- {
- Source: "mysql_prod_username",
- Target: "mysql_username",
- },
- },
- },
- {
- from: "[ { source: mysql_prod_username, target: mysql_username }, { source: redis_username, target: redis_username } ]",
- want: []*Secret{
- {
- Source: "mysql_prod_username",
- Target: "mysql_username",
- },
- {
- Source: "redis_username",
- Target: "redis_username",
- },
- },
- },
- }
-
- for _, test := range testdata {
- in := []byte(test.from)
- got := Secrets{}
- err := yaml.Unmarshal(in, &got)
- assert.NoError(t, err)
- assert.EqualValues(t, test.want, got.Secrets, "problem parsing secrets %q", test.from)
- }
-}
diff --git a/pipeline/frontend/yaml/types/workflow.go b/pipeline/frontend/yaml/types/workflow.go
index 4f291dec3..f1e753b3d 100644
--- a/pipeline/frontend/yaml/types/workflow.go
+++ b/pipeline/frontend/yaml/types/workflow.go
@@ -34,13 +34,6 @@ type (
// Undocumented
Networks WorkflowNetworks `yaml:"networks,omitempty"`
Volumes WorkflowVolumes `yaml:"volumes,omitempty"`
-
- // Deprecated
- PlatformDoNotUseIt string `yaml:"platform,omitempty"` // TODO: remove in next major version
- // Deprecated
- BranchesDoNotUseIt *constraint.List `yaml:"branches,omitempty"` // TODO: remove in next major version
- // Deprecated
- PipelineDoNotUseIt ContainerList `yaml:"pipeline,omitempty"` // TODO: remove in next major version
}
// Workspace defines a pipeline workspace.
diff --git a/pipeline/frontend/yaml/utils/image.go b/pipeline/frontend/yaml/utils/image.go
index 63054c21d..43d139ee0 100644
--- a/pipeline/frontend/yaml/utils/image.go
+++ b/pipeline/frontend/yaml/utils/image.go
@@ -14,7 +14,11 @@
package utils
-import "github.com/distribution/reference"
+import (
+ "strings"
+
+ "github.com/distribution/reference"
+)
// trimImage returns the short image name without tag.
func trimImage(name string) string {
@@ -57,14 +61,42 @@ func MatchImage(from string, to ...string) bool {
return false
}
+// MatchImageDynamic check if image is in list based on list.
+// If an list entry has a tag specified it only will match if both are the same, else the tag is ignored.
+func MatchImageDynamic(from string, to ...string) bool {
+ fullFrom := expandImage(from)
+ trimFrom := trimImage(from)
+ for _, match := range to {
+ if imageHasTag(match) {
+ if fullFrom == expandImage(match) {
+ return true
+ }
+ } else {
+ if trimFrom == trimImage(match) {
+ return true
+ }
+ }
+ }
+ return false
+}
+
+func imageHasTag(name string) bool {
+ return strings.Contains(name, ":")
+}
+
+// ParseNamed parses an image as a reference to validate it then parses it as a named reference.
+func ParseNamed(image string) (reference.Named, error) {
+ ref, err := reference.ParseAnyReference(image)
+ if err != nil {
+ return nil, err
+ }
+ return reference.ParseNamed(ref.String())
+}
+
// MatchHostname returns true if the image hostname
// matches the specified hostname.
func MatchHostname(image, hostname string) bool {
- ref, err := reference.ParseAnyReference(image)
- if err != nil {
- return false
- }
- named, err := reference.ParseNamed(ref.String())
+ named, err := ParseNamed(image)
if err != nil {
return false
}
diff --git a/pipeline/frontend/yaml/utils/image_test.go b/pipeline/frontend/yaml/utils/image_test.go
index 17fab45d5..a1250a49d 100644
--- a/pipeline/frontend/yaml/utils/image_test.go
+++ b/pipeline/frontend/yaml/utils/image_test.go
@@ -113,6 +113,10 @@ func Test_expandImage(t *testing.T) {
from: "gcr.io/golang:1.0.0",
want: "gcr.io/golang:1.0.0",
},
+ {
+ from: "codeberg.org/6543/hello:latest@2c98dce11f78c2b4e40f513ca82f75035eb8cfa4957a6d8eb3f917ecaf77803",
+ want: "codeberg.org/6543/hello:latest@2c98dce11f78c2b4e40f513ca82f75035eb8cfa4957a6d8eb3f917ecaf77803",
+ },
// error cases, return input unmodified
{
from: "foo/bar?baz:boo",
@@ -124,6 +128,57 @@ func Test_expandImage(t *testing.T) {
}
}
+func Test_imageHasTag(t *testing.T) {
+ testdata := []struct {
+ from string
+ want bool
+ }{
+ {
+ from: "golang",
+ want: false,
+ },
+ {
+ from: "golang:latest",
+ want: true,
+ },
+ {
+ from: "golang:1.0.0",
+ want: true,
+ },
+ {
+ from: "library/golang",
+ want: false,
+ },
+ {
+ from: "library/golang:latest",
+ want: true,
+ },
+ {
+ from: "library/golang:1.0.0",
+ want: true,
+ },
+ {
+ from: "index.docker.io/library/golang:1.0.0",
+ want: true,
+ },
+ {
+ from: "gcr.io/golang",
+ want: false,
+ },
+ {
+ from: "gcr.io/golang:1.0.0",
+ want: true,
+ },
+ {
+ from: "codeberg.org/6543/hello:latest@2c98dce11f78c2b4e40f513ca82f75035eb8cfa4957a6d8eb3f917ecaf77803",
+ want: true,
+ },
+ }
+ for _, test := range testdata {
+ assert.Equal(t, test.want, imageHasTag(test.from))
+ }
+}
+
func Test_matchImage(t *testing.T) {
testdata := []struct {
from, to string
@@ -199,12 +254,67 @@ func Test_matchImage(t *testing.T) {
to: "gcr.io/golang",
want: false,
},
+ {
+ from: "woodpeckerci/plugin-kaniko",
+ to: "docker.io/woodpeckerci/plugin-kaniko",
+ want: true,
+ },
}
for _, test := range testdata {
assert.Equal(t, test.want, MatchImage(test.from, test.to))
}
}
+func Test_matchImageDynamic(t *testing.T) {
+ testdata := []struct {
+ name, from string
+ to []string
+ want bool
+ }{
+ {
+ name: "simple compare",
+ from: "golang",
+ to: []string{"golang"},
+ want: true,
+ },
+ {
+ name: "compare non-taged image whit list who tag requirement",
+ from: "golang",
+ to: []string{"golang:v3.0"},
+ want: false,
+ },
+ {
+ name: "compare taged image whit list who tag no requirement",
+ from: "golang:v3.0",
+ to: []string{"golang"},
+ want: true,
+ },
+ {
+ name: "compare taged image whit list who has image with no tag requirement",
+ from: "golang:1.0",
+ to: []string{"golang", "golang:2.0"},
+ want: true,
+ },
+ {
+ name: "compare taged image whit list who only has images with tag requirement",
+ from: "golang:1.0",
+ to: []string{"golang:latest", "golang:2.0"},
+ want: false,
+ },
+ {
+ name: "compare taged image whit list who only has images with tag requirement",
+ from: "golang:1.0",
+ to: []string{"golang:latest", "golang:1.0"},
+ want: true,
+ },
+ }
+ for _, test := range testdata {
+ if !assert.Equal(t, test.want, MatchImageDynamic(test.from, test.to...)) {
+ t.Logf("test data: '%s' -> '%s'", test.from, test.to)
+ }
+ }
+}
+
func Test_matchHostname(t *testing.T) {
testdata := []struct {
image, hostname string
diff --git a/pipeline/log/line_writer.go b/pipeline/log/line_writer.go
index 0c5058f45..ff8706f36 100644
--- a/pipeline/log/line_writer.go
+++ b/pipeline/log/line_writer.go
@@ -16,7 +16,6 @@
package log
import (
- "context"
"io"
"strings"
"sync"
@@ -67,9 +66,6 @@ func (w *LineWriter) Write(p []byte) (n int, err error) {
w.num++
- if err := w.peer.Log(context.Background(), line); err != nil {
- return 0, err
- }
-
+ w.peer.EnqueueLog(line)
return len(data), nil
}
diff --git a/pipeline/log/line_writer_test.go b/pipeline/log/line_writer_test.go
index 8bf8f6251..8a2d6b120 100644
--- a/pipeline/log/line_writer_test.go
+++ b/pipeline/log/line_writer_test.go
@@ -27,7 +27,7 @@ import (
func TestLineWriter(t *testing.T) {
peer := mocks.NewPeer(t)
- peer.On("Log", mock.Anything, mock.Anything).Return(nil)
+ peer.On("EnqueueLog", mock.Anything)
secrets := []string{"world"}
lw := log.NewLineWriter(peer, "e9ea76a5-44a1-4059-9c4a-6956c478b26d", secrets...)
@@ -37,7 +37,7 @@ func TestLineWriter(t *testing.T) {
_, err = lw.Write([]byte("the previous line had no newline at the end"))
assert.NoError(t, err)
- peer.AssertCalled(t, "Log", mock.Anything, &rpc.LogEntry{
+ peer.AssertCalled(t, "EnqueueLog", &rpc.LogEntry{
StepUUID: "e9ea76a5-44a1-4059-9c4a-6956c478b26d",
Time: 0,
Type: rpc.LogEntryStdout,
@@ -45,7 +45,7 @@ func TestLineWriter(t *testing.T) {
Data: []byte("hello ********"),
})
- peer.AssertCalled(t, "Log", mock.Anything, &rpc.LogEntry{
+ peer.AssertCalled(t, "EnqueueLog", &rpc.LogEntry{
StepUUID: "e9ea76a5-44a1-4059-9c4a-6956c478b26d",
Time: 0,
Type: rpc.LogEntryStdout,
diff --git a/pipeline/log/utils_test.go b/pipeline/log/utils_test.go
index b094d1409..cbc15b735 100644
--- a/pipeline/log/utils_test.go
+++ b/pipeline/log/utils_test.go
@@ -83,7 +83,7 @@ func TestCopyLineByLine(t *testing.T) {
assert.Lenf(t, writes, 2, "expected 2 writes, got: %v", writes)
// wait for the goroutine to write the data
- time.Sleep(time.Millisecond)
+ time.Sleep(10 * time.Millisecond)
writtenData := strings.Join(writes, "-")
assert.Equal(t, "12345\n-678\n", writtenData, "unexpected writtenData: %s", writtenData)
diff --git a/pipeline/pipeline.go b/pipeline/pipeline.go
index 6e9d9f181..2b732b444 100644
--- a/pipeline/pipeline.go
+++ b/pipeline/pipeline.go
@@ -258,9 +258,9 @@ func (r *Runtime) exec(step *backend.Step) (*backend.State, error) {
return nil, nil
}
- // Some pipeline backends, such as local, will close the pipe from Tail on Wait,
- // so first make sure all reading has finished.
+ // We wait until all data was logged. (Needed for some backends like local as WaitStep kills the log stream)
wg.Wait()
+
waitState, err := r.engine.WaitStep(r.ctx, step, r.taskUUID)
if err != nil {
if errors.Is(err, context.Canceled) {
diff --git a/pipeline/rpc/mocks/peer.go b/pipeline/rpc/mocks/peer.go
index 8d0c45d18..baac63d6e 100644
--- a/pipeline/rpc/mocks/peer.go
+++ b/pipeline/rpc/mocks/peer.go
@@ -35,6 +35,11 @@ func (_m *Peer) Done(c context.Context, workflowID string, state rpc.WorkflowSta
return r0
}
+// EnqueueLog provides a mock function with given fields: logEntry
+func (_m *Peer) EnqueueLog(logEntry *rpc.LogEntry) {
+ _m.Called(logEntry)
+}
+
// Extend provides a mock function with given fields: c, workflowID
func (_m *Peer) Extend(c context.Context, workflowID string) error {
ret := _m.Called(c, workflowID)
@@ -71,24 +76,6 @@ func (_m *Peer) Init(c context.Context, workflowID string, state rpc.WorkflowSta
return r0
}
-// Log provides a mock function with given fields: c, logEntry
-func (_m *Peer) Log(c context.Context, logEntry *rpc.LogEntry) error {
- ret := _m.Called(c, logEntry)
-
- if len(ret) == 0 {
- panic("no return value specified for Log")
- }
-
- var r0 error
- if rf, ok := ret.Get(0).(func(context.Context, *rpc.LogEntry) error); ok {
- r0 = rf(c, logEntry)
- } else {
- r0 = ret.Error(0)
- }
-
- return r0
-}
-
// Next provides a mock function with given fields: c, f
func (_m *Peer) Next(c context.Context, f rpc.Filter) (*rpc.Workflow, error) {
ret := _m.Called(c, f)
@@ -119,9 +106,9 @@ func (_m *Peer) Next(c context.Context, f rpc.Filter) (*rpc.Workflow, error) {
return r0, r1
}
-// RegisterAgent provides a mock function with given fields: ctx, platform, backend, version, capacity
-func (_m *Peer) RegisterAgent(ctx context.Context, platform string, backend string, version string, capacity int) (int64, error) {
- ret := _m.Called(ctx, platform, backend, version, capacity)
+// RegisterAgent provides a mock function with given fields: ctx, info
+func (_m *Peer) RegisterAgent(ctx context.Context, info rpc.AgentInfo) (int64, error) {
+ ret := _m.Called(ctx, info)
if len(ret) == 0 {
panic("no return value specified for RegisterAgent")
@@ -129,17 +116,17 @@ func (_m *Peer) RegisterAgent(ctx context.Context, platform string, backend stri
var r0 int64
var r1 error
- if rf, ok := ret.Get(0).(func(context.Context, string, string, string, int) (int64, error)); ok {
- return rf(ctx, platform, backend, version, capacity)
+ if rf, ok := ret.Get(0).(func(context.Context, rpc.AgentInfo) (int64, error)); ok {
+ return rf(ctx, info)
}
- if rf, ok := ret.Get(0).(func(context.Context, string, string, string, int) int64); ok {
- r0 = rf(ctx, platform, backend, version, capacity)
+ if rf, ok := ret.Get(0).(func(context.Context, rpc.AgentInfo) int64); ok {
+ r0 = rf(ctx, info)
} else {
r0 = ret.Get(0).(int64)
}
- if rf, ok := ret.Get(1).(func(context.Context, string, string, string, int) error); ok {
- r1 = rf(ctx, platform, backend, version, capacity)
+ if rf, ok := ret.Get(1).(func(context.Context, rpc.AgentInfo) error); ok {
+ r1 = rf(ctx, info)
} else {
r1 = ret.Error(1)
}
diff --git a/pipeline/rpc/peer.go b/pipeline/rpc/peer.go
index b38b01051..c47104210 100644
--- a/pipeline/rpc/peer.go
+++ b/pipeline/rpc/peer.go
@@ -55,6 +55,15 @@ type (
GrpcVersion int32 `json:"grpc_version,omitempty"`
ServerVersion string `json:"server_version,omitempty"`
}
+
+ // AgentInfo represents all the metadata that should be known about an agent.
+ AgentInfo struct {
+ Version string `json:"version"`
+ Platform string `json:"platform"`
+ Backend string `json:"backend"`
+ Capacity int `json:"capacity"`
+ CustomLabels map[string]string `json:"custom_labels"`
+ }
)
//go:generate mockery --name Peer --output mocks --case underscore --note "+build test"
@@ -82,11 +91,11 @@ type Peer interface {
// Update updates the step state
Update(c context.Context, workflowID string, state StepState) error
- // Log writes the step log entry
- Log(c context.Context, logEntry *LogEntry) error
+ // EnqueueLog queues the step log entry for delayed sending
+ EnqueueLog(logEntry *LogEntry)
// RegisterAgent register our agent to the server
- RegisterAgent(ctx context.Context, platform, backend, version string, capacity int) (int64, error)
+ RegisterAgent(ctx context.Context, info AgentInfo) (int64, error)
// UnregisterAgent unregister our agent from the server
UnregisterAgent(ctx context.Context) error
diff --git a/pipeline/rpc/proto/version.go b/pipeline/rpc/proto/version.go
index 2de7645f3..9305354c4 100644
--- a/pipeline/rpc/proto/version.go
+++ b/pipeline/rpc/proto/version.go
@@ -16,4 +16,4 @@ package proto
// Version is the version of the woodpecker.proto file,
// IMPORTANT: increased by 1 each time it get changed.
-const Version int32 = 9
+const Version int32 = 11
diff --git a/pipeline/rpc/proto/woodpecker.pb.go b/pipeline/rpc/proto/woodpecker.pb.go
index e7cfcad3c..d7fca2aa8 100644
--- a/pipeline/rpc/proto/woodpecker.pb.go
+++ b/pipeline/rpc/proto/woodpecker.pb.go
@@ -16,7 +16,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.34.1
-// protoc v4.25.3
+// protoc v4.25.4
// source: woodpecker.proto
package proto
@@ -685,7 +685,7 @@ type LogRequest struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- LogEntry *LogEntry `protobuf:"bytes,1,opt,name=logEntry,proto3" json:"logEntry,omitempty"`
+ LogEntries []*LogEntry `protobuf:"bytes,1,rep,name=logEntries,proto3" json:"logEntries,omitempty"`
}
func (x *LogRequest) Reset() {
@@ -720,9 +720,9 @@ func (*LogRequest) Descriptor() ([]byte, []int) {
return file_woodpecker_proto_rawDescGZIP(), []int{11}
}
-func (x *LogRequest) GetLogEntry() *LogEntry {
+func (x *LogRequest) GetLogEntries() []*LogEntry {
if x != nil {
- return x.LogEntry
+ return x.LogEntries
}
return nil
}
@@ -812,21 +812,97 @@ func (x *ReportHealthRequest) GetStatus() string {
return ""
}
+type AgentInfo struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Platform string `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"`
+ Capacity int32 `protobuf:"varint,2,opt,name=capacity,proto3" json:"capacity,omitempty"`
+ Backend string `protobuf:"bytes,3,opt,name=backend,proto3" json:"backend,omitempty"`
+ Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
+ CustomLabels map[string]string `protobuf:"bytes,5,rep,name=customLabels,proto3" json:"customLabels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+}
+
+func (x *AgentInfo) Reset() {
+ *x = AgentInfo{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_woodpecker_proto_msgTypes[14]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *AgentInfo) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AgentInfo) ProtoMessage() {}
+
+func (x *AgentInfo) ProtoReflect() protoreflect.Message {
+ mi := &file_woodpecker_proto_msgTypes[14]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use AgentInfo.ProtoReflect.Descriptor instead.
+func (*AgentInfo) Descriptor() ([]byte, []int) {
+ return file_woodpecker_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *AgentInfo) GetPlatform() string {
+ if x != nil {
+ return x.Platform
+ }
+ return ""
+}
+
+func (x *AgentInfo) GetCapacity() int32 {
+ if x != nil {
+ return x.Capacity
+ }
+ return 0
+}
+
+func (x *AgentInfo) GetBackend() string {
+ if x != nil {
+ return x.Backend
+ }
+ return ""
+}
+
+func (x *AgentInfo) GetVersion() string {
+ if x != nil {
+ return x.Version
+ }
+ return ""
+}
+
+func (x *AgentInfo) GetCustomLabels() map[string]string {
+ if x != nil {
+ return x.CustomLabels
+ }
+ return nil
+}
+
type RegisterAgentRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Platform string `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform,omitempty"`
- Capacity int32 `protobuf:"varint,2,opt,name=capacity,proto3" json:"capacity,omitempty"`
- Backend string `protobuf:"bytes,3,opt,name=backend,proto3" json:"backend,omitempty"`
- Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
+ Info *AgentInfo `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"`
}
func (x *RegisterAgentRequest) Reset() {
*x = RegisterAgentRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_woodpecker_proto_msgTypes[14]
+ mi := &file_woodpecker_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -839,7 +915,7 @@ func (x *RegisterAgentRequest) String() string {
func (*RegisterAgentRequest) ProtoMessage() {}
func (x *RegisterAgentRequest) ProtoReflect() protoreflect.Message {
- mi := &file_woodpecker_proto_msgTypes[14]
+ mi := &file_woodpecker_proto_msgTypes[15]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -852,35 +928,14 @@ func (x *RegisterAgentRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use RegisterAgentRequest.ProtoReflect.Descriptor instead.
func (*RegisterAgentRequest) Descriptor() ([]byte, []int) {
- return file_woodpecker_proto_rawDescGZIP(), []int{14}
+ return file_woodpecker_proto_rawDescGZIP(), []int{15}
}
-func (x *RegisterAgentRequest) GetPlatform() string {
+func (x *RegisterAgentRequest) GetInfo() *AgentInfo {
if x != nil {
- return x.Platform
+ return x.Info
}
- return ""
-}
-
-func (x *RegisterAgentRequest) GetCapacity() int32 {
- if x != nil {
- return x.Capacity
- }
- return 0
-}
-
-func (x *RegisterAgentRequest) GetBackend() string {
- if x != nil {
- return x.Backend
- }
- return ""
-}
-
-func (x *RegisterAgentRequest) GetVersion() string {
- if x != nil {
- return x.Version
- }
- return ""
+ return nil
}
type VersionResponse struct {
@@ -895,7 +950,7 @@ type VersionResponse struct {
func (x *VersionResponse) Reset() {
*x = VersionResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_woodpecker_proto_msgTypes[15]
+ mi := &file_woodpecker_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -908,7 +963,7 @@ func (x *VersionResponse) String() string {
func (*VersionResponse) ProtoMessage() {}
func (x *VersionResponse) ProtoReflect() protoreflect.Message {
- mi := &file_woodpecker_proto_msgTypes[15]
+ mi := &file_woodpecker_proto_msgTypes[16]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -921,7 +976,7 @@ func (x *VersionResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use VersionResponse.ProtoReflect.Descriptor instead.
func (*VersionResponse) Descriptor() ([]byte, []int) {
- return file_woodpecker_proto_rawDescGZIP(), []int{15}
+ return file_woodpecker_proto_rawDescGZIP(), []int{16}
}
func (x *VersionResponse) GetGrpcVersion() int32 {
@@ -949,7 +1004,7 @@ type NextResponse struct {
func (x *NextResponse) Reset() {
*x = NextResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_woodpecker_proto_msgTypes[16]
+ mi := &file_woodpecker_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -962,7 +1017,7 @@ func (x *NextResponse) String() string {
func (*NextResponse) ProtoMessage() {}
func (x *NextResponse) ProtoReflect() protoreflect.Message {
- mi := &file_woodpecker_proto_msgTypes[16]
+ mi := &file_woodpecker_proto_msgTypes[17]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -975,7 +1030,7 @@ func (x *NextResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use NextResponse.ProtoReflect.Descriptor instead.
func (*NextResponse) Descriptor() ([]byte, []int) {
- return file_woodpecker_proto_rawDescGZIP(), []int{16}
+ return file_woodpecker_proto_rawDescGZIP(), []int{17}
}
func (x *NextResponse) GetWorkflow() *Workflow {
@@ -996,7 +1051,7 @@ type RegisterAgentResponse struct {
func (x *RegisterAgentResponse) Reset() {
*x = RegisterAgentResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_woodpecker_proto_msgTypes[17]
+ mi := &file_woodpecker_proto_msgTypes[18]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1009,7 +1064,7 @@ func (x *RegisterAgentResponse) String() string {
func (*RegisterAgentResponse) ProtoMessage() {}
func (x *RegisterAgentResponse) ProtoReflect() protoreflect.Message {
- mi := &file_woodpecker_proto_msgTypes[17]
+ mi := &file_woodpecker_proto_msgTypes[18]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1022,7 +1077,7 @@ func (x *RegisterAgentResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use RegisterAgentResponse.ProtoReflect.Descriptor instead.
func (*RegisterAgentResponse) Descriptor() ([]byte, []int) {
- return file_woodpecker_proto_rawDescGZIP(), []int{17}
+ return file_woodpecker_proto_rawDescGZIP(), []int{18}
}
func (x *RegisterAgentResponse) GetAgentId() int64 {
@@ -1044,7 +1099,7 @@ type AuthRequest struct {
func (x *AuthRequest) Reset() {
*x = AuthRequest{}
if protoimpl.UnsafeEnabled {
- mi := &file_woodpecker_proto_msgTypes[18]
+ mi := &file_woodpecker_proto_msgTypes[19]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1057,7 +1112,7 @@ func (x *AuthRequest) String() string {
func (*AuthRequest) ProtoMessage() {}
func (x *AuthRequest) ProtoReflect() protoreflect.Message {
- mi := &file_woodpecker_proto_msgTypes[18]
+ mi := &file_woodpecker_proto_msgTypes[19]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1070,7 +1125,7 @@ func (x *AuthRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use AuthRequest.ProtoReflect.Descriptor instead.
func (*AuthRequest) Descriptor() ([]byte, []int) {
- return file_woodpecker_proto_rawDescGZIP(), []int{18}
+ return file_woodpecker_proto_rawDescGZIP(), []int{19}
}
func (x *AuthRequest) GetAgentToken() string {
@@ -1100,7 +1155,7 @@ type AuthResponse struct {
func (x *AuthResponse) Reset() {
*x = AuthResponse{}
if protoimpl.UnsafeEnabled {
- mi := &file_woodpecker_proto_msgTypes[19]
+ mi := &file_woodpecker_proto_msgTypes[20]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -1113,7 +1168,7 @@ func (x *AuthResponse) String() string {
func (*AuthResponse) ProtoMessage() {}
func (x *AuthResponse) ProtoReflect() protoreflect.Message {
- mi := &file_woodpecker_proto_msgTypes[19]
+ mi := &file_woodpecker_proto_msgTypes[20]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -1126,7 +1181,7 @@ func (x *AuthResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use AuthResponse.ProtoReflect.Descriptor instead.
func (*AuthResponse) Descriptor() ([]byte, []int) {
- return file_woodpecker_proto_rawDescGZIP(), []int{19}
+ return file_woodpecker_proto_rawDescGZIP(), []int{20}
}
func (x *AuthResponse) GetStatus() string {
@@ -1212,22 +1267,34 @@ var file_woodpecker_proto_rawDesc = []byte{
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64,
0x12, 0x26, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74,
- 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x39, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x52,
- 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x45, 0x6e, 0x74,
- 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x45, 0x6e,
- 0x74, 0x72, 0x79, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x2d, 0x0a, 0x13,
- 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75,
- 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20,
- 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x14,
- 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71,
- 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
- 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
- 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01,
- 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07,
- 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62,
- 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
- 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+ 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3d, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x45, 0x6e, 0x74,
+ 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x72, 0x6f,
+ 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6c, 0x6f, 0x67,
+ 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79,
+ 0x22, 0x2d, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22,
+ 0x80, 0x02, 0x0a, 0x09, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a,
+ 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70,
+ 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70,
+ 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
+ 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12,
+ 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+ 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x63, 0x75, 0x73,
+ 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,
+ 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66,
+ 0x6f, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e,
+ 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c,
+ 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c,
+ 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
+ 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
+ 0x38, 0x01, 0x22, 0x3c, 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x41, 0x67,
+ 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x69, 0x6e,
+ 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+ 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f,
0x22, 0x5b, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x76, 0x65, 0x72, 0x73,
0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x56,
@@ -1311,7 +1378,7 @@ func file_woodpecker_proto_rawDescGZIP() []byte {
return file_woodpecker_proto_rawDescData
}
-var file_woodpecker_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
+var file_woodpecker_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
var file_woodpecker_proto_goTypes = []interface{}{
(*StepState)(nil), // 0: proto.StepState
(*WorkflowState)(nil), // 1: proto.WorkflowState
@@ -1327,51 +1394,55 @@ var file_woodpecker_proto_goTypes = []interface{}{
(*LogRequest)(nil), // 11: proto.LogRequest
(*Empty)(nil), // 12: proto.Empty
(*ReportHealthRequest)(nil), // 13: proto.ReportHealthRequest
- (*RegisterAgentRequest)(nil), // 14: proto.RegisterAgentRequest
- (*VersionResponse)(nil), // 15: proto.VersionResponse
- (*NextResponse)(nil), // 16: proto.NextResponse
- (*RegisterAgentResponse)(nil), // 17: proto.RegisterAgentResponse
- (*AuthRequest)(nil), // 18: proto.AuthRequest
- (*AuthResponse)(nil), // 19: proto.AuthResponse
- nil, // 20: proto.Filter.LabelsEntry
+ (*AgentInfo)(nil), // 14: proto.AgentInfo
+ (*RegisterAgentRequest)(nil), // 15: proto.RegisterAgentRequest
+ (*VersionResponse)(nil), // 16: proto.VersionResponse
+ (*NextResponse)(nil), // 17: proto.NextResponse
+ (*RegisterAgentResponse)(nil), // 18: proto.RegisterAgentResponse
+ (*AuthRequest)(nil), // 19: proto.AuthRequest
+ (*AuthResponse)(nil), // 20: proto.AuthResponse
+ nil, // 21: proto.Filter.LabelsEntry
+ nil, // 22: proto.AgentInfo.CustomLabelsEntry
}
var file_woodpecker_proto_depIdxs = []int32{
- 20, // 0: proto.Filter.labels:type_name -> proto.Filter.LabelsEntry
+ 21, // 0: proto.Filter.labels:type_name -> proto.Filter.LabelsEntry
3, // 1: proto.NextRequest.filter:type_name -> proto.Filter
1, // 2: proto.InitRequest.state:type_name -> proto.WorkflowState
1, // 3: proto.DoneRequest.state:type_name -> proto.WorkflowState
0, // 4: proto.UpdateRequest.state:type_name -> proto.StepState
- 2, // 5: proto.LogRequest.logEntry:type_name -> proto.LogEntry
- 4, // 6: proto.NextResponse.workflow:type_name -> proto.Workflow
- 12, // 7: proto.Woodpecker.Version:input_type -> proto.Empty
- 5, // 8: proto.Woodpecker.Next:input_type -> proto.NextRequest
- 6, // 9: proto.Woodpecker.Init:input_type -> proto.InitRequest
- 7, // 10: proto.Woodpecker.Wait:input_type -> proto.WaitRequest
- 8, // 11: proto.Woodpecker.Done:input_type -> proto.DoneRequest
- 9, // 12: proto.Woodpecker.Extend:input_type -> proto.ExtendRequest
- 10, // 13: proto.Woodpecker.Update:input_type -> proto.UpdateRequest
- 11, // 14: proto.Woodpecker.Log:input_type -> proto.LogRequest
- 14, // 15: proto.Woodpecker.RegisterAgent:input_type -> proto.RegisterAgentRequest
- 12, // 16: proto.Woodpecker.UnregisterAgent:input_type -> proto.Empty
- 13, // 17: proto.Woodpecker.ReportHealth:input_type -> proto.ReportHealthRequest
- 18, // 18: proto.WoodpeckerAuth.Auth:input_type -> proto.AuthRequest
- 15, // 19: proto.Woodpecker.Version:output_type -> proto.VersionResponse
- 16, // 20: proto.Woodpecker.Next:output_type -> proto.NextResponse
- 12, // 21: proto.Woodpecker.Init:output_type -> proto.Empty
- 12, // 22: proto.Woodpecker.Wait:output_type -> proto.Empty
- 12, // 23: proto.Woodpecker.Done:output_type -> proto.Empty
- 12, // 24: proto.Woodpecker.Extend:output_type -> proto.Empty
- 12, // 25: proto.Woodpecker.Update:output_type -> proto.Empty
- 12, // 26: proto.Woodpecker.Log:output_type -> proto.Empty
- 17, // 27: proto.Woodpecker.RegisterAgent:output_type -> proto.RegisterAgentResponse
- 12, // 28: proto.Woodpecker.UnregisterAgent:output_type -> proto.Empty
- 12, // 29: proto.Woodpecker.ReportHealth:output_type -> proto.Empty
- 19, // 30: proto.WoodpeckerAuth.Auth:output_type -> proto.AuthResponse
- 19, // [19:31] is the sub-list for method output_type
- 7, // [7:19] is the sub-list for method input_type
- 7, // [7:7] is the sub-list for extension type_name
- 7, // [7:7] is the sub-list for extension extendee
- 0, // [0:7] is the sub-list for field type_name
+ 2, // 5: proto.LogRequest.logEntries:type_name -> proto.LogEntry
+ 22, // 6: proto.AgentInfo.customLabels:type_name -> proto.AgentInfo.CustomLabelsEntry
+ 14, // 7: proto.RegisterAgentRequest.info:type_name -> proto.AgentInfo
+ 4, // 8: proto.NextResponse.workflow:type_name -> proto.Workflow
+ 12, // 9: proto.Woodpecker.Version:input_type -> proto.Empty
+ 5, // 10: proto.Woodpecker.Next:input_type -> proto.NextRequest
+ 6, // 11: proto.Woodpecker.Init:input_type -> proto.InitRequest
+ 7, // 12: proto.Woodpecker.Wait:input_type -> proto.WaitRequest
+ 8, // 13: proto.Woodpecker.Done:input_type -> proto.DoneRequest
+ 9, // 14: proto.Woodpecker.Extend:input_type -> proto.ExtendRequest
+ 10, // 15: proto.Woodpecker.Update:input_type -> proto.UpdateRequest
+ 11, // 16: proto.Woodpecker.Log:input_type -> proto.LogRequest
+ 15, // 17: proto.Woodpecker.RegisterAgent:input_type -> proto.RegisterAgentRequest
+ 12, // 18: proto.Woodpecker.UnregisterAgent:input_type -> proto.Empty
+ 13, // 19: proto.Woodpecker.ReportHealth:input_type -> proto.ReportHealthRequest
+ 19, // 20: proto.WoodpeckerAuth.Auth:input_type -> proto.AuthRequest
+ 16, // 21: proto.Woodpecker.Version:output_type -> proto.VersionResponse
+ 17, // 22: proto.Woodpecker.Next:output_type -> proto.NextResponse
+ 12, // 23: proto.Woodpecker.Init:output_type -> proto.Empty
+ 12, // 24: proto.Woodpecker.Wait:output_type -> proto.Empty
+ 12, // 25: proto.Woodpecker.Done:output_type -> proto.Empty
+ 12, // 26: proto.Woodpecker.Extend:output_type -> proto.Empty
+ 12, // 27: proto.Woodpecker.Update:output_type -> proto.Empty
+ 12, // 28: proto.Woodpecker.Log:output_type -> proto.Empty
+ 18, // 29: proto.Woodpecker.RegisterAgent:output_type -> proto.RegisterAgentResponse
+ 12, // 30: proto.Woodpecker.UnregisterAgent:output_type -> proto.Empty
+ 12, // 31: proto.Woodpecker.ReportHealth:output_type -> proto.Empty
+ 20, // 32: proto.WoodpeckerAuth.Auth:output_type -> proto.AuthResponse
+ 21, // [21:33] is the sub-list for method output_type
+ 9, // [9:21] is the sub-list for method input_type
+ 9, // [9:9] is the sub-list for extension type_name
+ 9, // [9:9] is the sub-list for extension extendee
+ 0, // [0:9] is the sub-list for field type_name
}
func init() { file_woodpecker_proto_init() }
@@ -1549,7 +1620,7 @@ func file_woodpecker_proto_init() {
}
}
file_woodpecker_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*RegisterAgentRequest); i {
+ switch v := v.(*AgentInfo); i {
case 0:
return &v.state
case 1:
@@ -1561,7 +1632,7 @@ func file_woodpecker_proto_init() {
}
}
file_woodpecker_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*VersionResponse); i {
+ switch v := v.(*RegisterAgentRequest); i {
case 0:
return &v.state
case 1:
@@ -1573,7 +1644,7 @@ func file_woodpecker_proto_init() {
}
}
file_woodpecker_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*NextResponse); i {
+ switch v := v.(*VersionResponse); i {
case 0:
return &v.state
case 1:
@@ -1585,7 +1656,7 @@ func file_woodpecker_proto_init() {
}
}
file_woodpecker_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*RegisterAgentResponse); i {
+ switch v := v.(*NextResponse); i {
case 0:
return &v.state
case 1:
@@ -1597,7 +1668,7 @@ func file_woodpecker_proto_init() {
}
}
file_woodpecker_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*AuthRequest); i {
+ switch v := v.(*RegisterAgentResponse); i {
case 0:
return &v.state
case 1:
@@ -1609,6 +1680,18 @@ func file_woodpecker_proto_init() {
}
}
file_woodpecker_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*AuthRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_woodpecker_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AuthResponse); i {
case 0:
return &v.state
@@ -1627,7 +1710,7 @@ func file_woodpecker_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_woodpecker_proto_rawDesc,
NumEnums: 0,
- NumMessages: 21,
+ NumMessages: 23,
NumExtensions: 0,
NumServices: 2,
},
diff --git a/pipeline/rpc/proto/woodpecker.proto b/pipeline/rpc/proto/woodpecker.proto
index 8fc577586..f9fef191b 100644
--- a/pipeline/rpc/proto/woodpecker.proto
+++ b/pipeline/rpc/proto/woodpecker.proto
@@ -106,7 +106,7 @@ message UpdateRequest {
}
message LogRequest {
- LogEntry logEntry = 1;
+ repeated LogEntry logEntries = 1;
}
message Empty {
@@ -116,11 +116,16 @@ message ReportHealthRequest {
string status = 1;
}
-message RegisterAgentRequest {
+message AgentInfo {
string platform = 1;
int32 capacity = 2;
string backend = 3;
string version = 4;
+ map customLabels = 5;
+}
+
+message RegisterAgentRequest {
+ AgentInfo info = 1;
}
//
diff --git a/pipeline/rpc/proto/woodpecker_grpc.pb.go b/pipeline/rpc/proto/woodpecker_grpc.pb.go
index 5b4ee588c..64437aeb1 100644
--- a/pipeline/rpc/proto/woodpecker_grpc.pb.go
+++ b/pipeline/rpc/proto/woodpecker_grpc.pb.go
@@ -16,7 +16,7 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.4.0
-// - protoc v4.25.3
+// - protoc v4.25.4
// source: woodpecker.proto
package proto
diff --git a/pipeline/tracer.go b/pipeline/tracer.go
index fb9194be1..f48a7c562 100644
--- a/pipeline/tracer.go
+++ b/pipeline/tracer.go
@@ -16,7 +16,6 @@ package pipeline
import (
"strconv"
- "time"
)
// Tracer handles process tracing.
@@ -43,17 +42,9 @@ var DefaultTracer = TraceFunc(func(state *State) error {
if state.Pipeline.Step.Environment == nil {
return nil
}
- state.Pipeline.Step.Environment["CI_PIPELINE_STATUS"] = "success"
state.Pipeline.Step.Environment["CI_PIPELINE_STARTED"] = strconv.FormatInt(state.Pipeline.Started, 10)
- state.Pipeline.Step.Environment["CI_PIPELINE_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10)
- state.Pipeline.Step.Environment["CI_STEP_STATUS"] = "success"
state.Pipeline.Step.Environment["CI_STEP_STARTED"] = strconv.FormatInt(state.Pipeline.Started, 10)
- state.Pipeline.Step.Environment["CI_STEP_FINISHED"] = strconv.FormatInt(time.Now().Unix(), 10)
- if state.Pipeline.Error != nil {
- state.Pipeline.Step.Environment["CI_PIPELINE_STATUS"] = "failure"
- state.Pipeline.Step.Environment["CI_STEP_STATUS"] = "failure"
- }
return nil
})
diff --git a/release-config.ts b/release-config.ts
index 13d36fd55..cabbcba0a 100644
--- a/release-config.ts
+++ b/release-config.ts
@@ -1,3 +1,4 @@
export default {
commentOnReleasedPullRequests: false,
+ skipLabels: ['skip-release', 'skip-changelog', 'regression', 'backport-done'],
};
diff --git a/server/api/agent.go b/server/api/agent.go
index 7b2d5f8d6..f6a542871 100644
--- a/server/api/agent.go
+++ b/server/api/agent.go
@@ -15,12 +15,10 @@
package api
import (
- "encoding/base32"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
- "github.com/gorilla/securecookie"
"go.woodpecker-ci.org/woodpecker/v2/server"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
@@ -28,6 +26,10 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/server/store"
)
+//
+// Global Agents.
+//
+
// GetAgents
//
// @Summary List agents
@@ -50,14 +52,14 @@ func GetAgents(c *gin.Context) {
// GetAgent
//
// @Summary Get an agent
-// @Router /agents/{agent} [get]
+// @Router /agents/{agent_id} [get]
// @Produce json
// @Success 200 {object} Agent
// @Tags Agents
// @Param Authorization header string true "Insert your personal access token" default(Bearer )
// @Param agent path int true "the agent's id"
func GetAgent(c *gin.Context) {
- agentID, err := strconv.ParseInt(c.Param("agent"), 10, 64)
+ agentID, err := strconv.ParseInt(c.Param("agent_id"), 10, 64)
if err != nil {
_ = c.AbortWithError(http.StatusBadRequest, err)
return
@@ -74,14 +76,14 @@ func GetAgent(c *gin.Context) {
// GetAgentTasks
//
// @Summary List agent tasks
-// @Router /agents/{agent}/tasks [get]
+// @Router /agents/{agent_id}/tasks [get]
// @Produce json
// @Success 200 {array} Task
// @Tags Agents
// @Param Authorization header string true "Insert your personal access token" default(Bearer )
// @Param agent path int true "the agent's id"
func GetAgentTasks(c *gin.Context) {
- agentID, err := strconv.ParseInt(c.Param("agent"), 10, 64)
+ agentID, err := strconv.ParseInt(c.Param("agent_id"), 10, 64)
if err != nil {
_ = c.AbortWithError(http.StatusBadRequest, err)
return
@@ -107,7 +109,7 @@ func GetAgentTasks(c *gin.Context) {
// PatchAgent
//
// @Summary Update an agent
-// @Router /agents/{agent} [patch]
+// @Router /agents/{agent_id} [patch]
// @Produce json
// @Success 200 {object} Agent
// @Tags Agents
@@ -124,7 +126,7 @@ func PatchAgent(c *gin.Context) {
return
}
- agentID, err := strconv.ParseInt(c.Param("agent"), 10, 64)
+ agentID, err := strconv.ParseInt(c.Param("agent_id"), 10, 64)
if err != nil {
_ = c.AbortWithError(http.StatusBadRequest, err)
return
@@ -135,6 +137,8 @@ func PatchAgent(c *gin.Context) {
handleDBError(c, err)
return
}
+
+ // Update allowed fields
agent.Name = in.Name
agent.NoSchedule = in.NoSchedule
if agent.NoSchedule {
@@ -172,11 +176,10 @@ func PostAgent(c *gin.Context) {
agent := &model.Agent{
Name: in.Name,
- NoSchedule: in.NoSchedule,
OwnerID: user.ID,
- Token: base32.StdEncoding.EncodeToString(
- securecookie.GenerateRandomKey(32),
- ),
+ OrgID: model.IDNotSet,
+ NoSchedule: in.NoSchedule,
+ Token: model.GenerateNewAgentToken(),
}
if err = store.FromContext(c).AgentCreate(agent); err != nil {
c.String(http.StatusInternalServerError, err.Error())
@@ -188,7 +191,7 @@ func PostAgent(c *gin.Context) {
// DeleteAgent
//
// @Summary Delete an agent
-// @Router /agents/{agent} [delete]
+// @Router /agents/{agent_id} [delete]
// @Produce plain
// @Success 200
// @Tags Agents
@@ -197,7 +200,7 @@ func PostAgent(c *gin.Context) {
func DeleteAgent(c *gin.Context) {
_store := store.FromContext(c)
- agentID, err := strconv.ParseInt(c.Param("agent"), 10, 64)
+ agentID, err := strconv.ParseInt(c.Param("agent_id"), 10, 64)
if err != nil {
_ = c.AbortWithError(http.StatusBadRequest, err)
return
@@ -227,3 +230,179 @@ func DeleteAgent(c *gin.Context) {
}
c.Status(http.StatusNoContent)
}
+
+//
+// Org/User Agents.
+//
+
+// PostOrgAgent
+//
+// @Summary Create a new organization-scoped agent
+// @Description Creates a new agent with a random token, scoped to the specified organization
+// @Router /orgs/{org_id}/agents [post]
+// @Produce json
+// @Success 200 {object} Agent
+// @Tags Agents
+// @Param Authorization header string true "Insert your personal access token" default(Bearer )
+// @Param org_id path int true "the organization's id"
+// @Param agent body Agent true "the agent's data (only 'name' and 'no_schedule' are read)"
+func PostOrgAgent(c *gin.Context) {
+ _store := store.FromContext(c)
+ user := session.User(c)
+
+ orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
+ if err != nil {
+ c.String(http.StatusBadRequest, "Invalid organization ID")
+ return
+ }
+
+ in := new(model.Agent)
+ err = c.Bind(in)
+ if err != nil {
+ c.String(http.StatusBadRequest, err.Error())
+ return
+ }
+
+ agent := &model.Agent{
+ Name: in.Name,
+ OwnerID: user.ID,
+ OrgID: orgID,
+ NoSchedule: in.NoSchedule,
+ Token: model.GenerateNewAgentToken(),
+ }
+
+ if err = _store.AgentCreate(agent); err != nil {
+ c.String(http.StatusInternalServerError, err.Error())
+ return
+ }
+
+ c.JSON(http.StatusOK, agent)
+}
+
+// GetOrgAgents
+//
+// @Summary List agents for an organization
+// @Router /orgs/{org_id}/agents [get]
+// @Produce json
+// @Success 200 {array} Agent
+// @Tags Agents
+// @Param Authorization header string true "Insert your personal access token" default(Bearer )
+// @Param org_id path int true "the organization's id"
+// @Param page query int false "for response pagination, page offset number" default(1)
+// @Param perPage query int false "for response pagination, max items per page" default(50)
+func GetOrgAgents(c *gin.Context) {
+ _store := store.FromContext(c)
+ org := session.Org(c)
+
+ agents, err := _store.AgentListForOrg(org.ID, session.Pagination(c))
+ if err != nil {
+ c.String(http.StatusInternalServerError, "Error getting agent list. %s", err)
+ return
+ }
+
+ c.JSON(http.StatusOK, agents)
+}
+
+// PatchOrgAgent
+//
+// @Summary Update an organization-scoped agent
+// @Router /orgs/{org_id}/agents/{agent_id} [patch]
+// @Produce json
+// @Success 200 {object} Agent
+// @Tags Agents
+// @Param Authorization header string true "Insert your personal access token" default(Bearer )
+// @Param org_id path int true "the organization's id"
+// @Param agent_id path int true "the agent's id"
+// @Param agent body Agent true "the agent's updated data"
+func PatchOrgAgent(c *gin.Context) {
+ _store := store.FromContext(c)
+ org := session.Org(c)
+
+ agentID, err := strconv.ParseInt(c.Param("agent_id"), 10, 64)
+ if err != nil {
+ c.String(http.StatusBadRequest, "Invalid agent ID")
+ return
+ }
+
+ agent, err := _store.AgentFind(agentID)
+ if err != nil {
+ c.String(http.StatusNotFound, "Agent not found")
+ return
+ }
+
+ if agent.OrgID != org.ID {
+ c.String(http.StatusBadRequest, "Agent does not belong to this organization")
+ return
+ }
+
+ in := new(model.Agent)
+ if err := c.Bind(in); err != nil {
+ c.String(http.StatusBadRequest, err.Error())
+ return
+ }
+
+ // Update allowed fields
+ agent.Name = in.Name
+ agent.NoSchedule = in.NoSchedule
+ if agent.NoSchedule {
+ server.Config.Services.Queue.KickAgentWorkers(agent.ID)
+ }
+
+ if err := _store.AgentUpdate(agent); err != nil {
+ c.String(http.StatusInternalServerError, err.Error())
+ return
+ }
+
+ c.JSON(http.StatusOK, agent)
+}
+
+// DeleteOrgAgent
+//
+// @Summary Delete an organization-scoped agent
+// @Router /orgs/{org_id}/agents/{agent_id} [delete]
+// @Produce plain
+// @Success 204
+// @Tags Agents
+// @Param Authorization header string true "Insert your personal access token" default(Bearer )
+// @Param org_id path int true "the organization's id"
+// @Param agent_id path int true "the agent's id"
+func DeleteOrgAgent(c *gin.Context) {
+ _store := store.FromContext(c)
+ org := session.Org(c)
+
+ agentID, err := strconv.ParseInt(c.Param("agent_id"), 10, 64)
+ if err != nil {
+ c.String(http.StatusBadRequest, "Invalid agent ID")
+ return
+ }
+
+ agent, err := _store.AgentFind(agentID)
+ if err != nil {
+ c.String(http.StatusNotFound, "Agent not found")
+ return
+ }
+
+ if agent.OrgID != org.ID {
+ c.String(http.StatusBadRequest, "Agent does not belong to this organization")
+ return
+ }
+
+ // Check if the agent has any running tasks
+ info := server.Config.Services.Queue.Info(c)
+ for _, task := range info.Running {
+ if task.AgentID == agent.ID {
+ c.String(http.StatusConflict, "Agent has running tasks")
+ return
+ }
+ }
+
+ // Kick workers to remove the agent from the queue
+ server.Config.Services.Queue.KickAgentWorkers(agent.ID)
+
+ if err := _store.AgentDelete(agent); err != nil {
+ c.String(http.StatusInternalServerError, "Error deleting agent. %s", err)
+ return
+ }
+
+ c.Status(http.StatusNoContent)
+}
diff --git a/server/api/hook.go b/server/api/hook.go
index 654acc93d..713fca39b 100644
--- a/server/api/hook.go
+++ b/server/api/hook.go
@@ -250,11 +250,8 @@ func PostHook(c *gin.Context) {
func getRepoFromToken(store store.Store, t *token.Token) (*model.Repo, error) {
// try to get the repo by the repo-id
repoID, err := strconv.ParseInt(t.Get("repo-id"), 10, 64)
- if err == nil {
- return store.GetRepo(repoID)
+ if err != nil {
+ return nil, err
}
-
- // try to get the repo by the repo name or by its redirection
- repoName := t.Get("text")
- return store.GetRepoName(repoName)
+ return store.GetRepo(repoID)
}
diff --git a/server/api/login.go b/server/api/login.go
index ebe6cf7b3..57bd91eae 100644
--- a/server/api/login.go
+++ b/server/api/login.go
@@ -297,54 +297,3 @@ func GetLogout(c *gin.Context) {
httputil.DelCookie(c.Writer, c.Request, "user_last")
c.Redirect(http.StatusSeeOther, server.Config.Server.RootPath+"/")
}
-
-// TODO: remove in 3.0
-func DeprecatedGetLoginToken(c *gin.Context) {
- _store := store.FromContext(c)
-
- _forge, err := server.Config.Services.Manager.ForgeByID(1)
- if err != nil {
- log.Error().Err(err).Msg("Cannot get main forge")
- c.AbortWithStatus(http.StatusInternalServerError)
- return
- }
-
- in := &tokenPayload{}
- err = c.Bind(in)
- if err != nil {
- _ = c.AbortWithError(http.StatusBadRequest, err)
- return
- }
-
- login, err := _forge.Auth(c, in.Access, in.Refresh)
- if err != nil {
- _ = c.AbortWithError(http.StatusUnauthorized, err)
- return
- }
-
- user, err := _store.GetUserLogin(login)
- if err != nil {
- handleDBError(c, err)
- return
- }
-
- exp := time.Now().Add(server.Config.Server.SessionExpires).Unix()
- newToken := token.New(token.SessToken)
- newToken.Set("user-id", strconv.FormatInt(user.ID, 10))
- tokenStr, err := newToken.SignExpires(user.Hash, exp)
- if err != nil {
- _ = c.AbortWithError(http.StatusInternalServerError, err)
- return
- }
-
- c.JSON(http.StatusOK, &tokenPayload{
- Access: tokenStr,
- Expires: exp - time.Now().Unix(),
- })
-}
-
-type tokenPayload struct {
- Access string `json:"access_token,omitempty"`
- Refresh string `json:"refresh_token,omitempty"`
- Expires int64 `json:"expires_in,omitempty"`
-}
diff --git a/server/api/org.go b/server/api/org.go
index 227859558..889398e7d 100644
--- a/server/api/org.go
+++ b/server/api/org.go
@@ -16,7 +16,6 @@ package api
import (
"net/http"
- "strconv"
"strings"
"github.com/gin-gonic/gin"
@@ -58,20 +57,7 @@ func GetOrgs(c *gin.Context) {
// @Param Authorization header string true "Insert your personal access token" default(Bearer )
// @Param org_id path string true "the organization's id"
func GetOrg(c *gin.Context) {
- _store := store.FromContext(c)
-
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
-
- org, err := _store.OrgGet(orgID)
- if err != nil {
- handleDBError(c, err)
- return
- }
-
+ org := session.Org(c)
c.JSON(http.StatusOK, org)
}
@@ -86,7 +72,7 @@ func GetOrg(c *gin.Context) {
// @Param org_id path string true "the organization's id"
func GetOrgPermissions(c *gin.Context) {
user := session.User(c)
- _store := store.FromContext(c)
+ org := session.Org(c)
_forge, err := server.Config.Services.Manager.ForgeFromUser(user)
if err != nil {
@@ -95,23 +81,11 @@ func GetOrgPermissions(c *gin.Context) {
return
}
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
-
if user == nil {
c.JSON(http.StatusOK, &model.OrgPerm{})
return
}
- org, err := _store.OrgGet(orgID)
- if err != nil {
- c.String(http.StatusInternalServerError, "Error getting org %d. %s", orgID, err)
- return
- }
-
if (org.IsUser && org.Name == user.Login) || (user.Admin && !org.IsUser) {
c.JSON(http.StatusOK, &model.OrgPerm{
Member: true,
@@ -125,7 +99,7 @@ func GetOrgPermissions(c *gin.Context) {
perm, err := server.Config.Services.Membership.Get(c, _forge, user, org.Name)
if err != nil {
- c.String(http.StatusInternalServerError, "Error getting membership for %d. %s", orgID, err)
+ c.String(http.StatusInternalServerError, "Error getting membership for %d. %s", org.ID, err)
return
}
@@ -200,15 +174,9 @@ func LookupOrg(c *gin.Context) {
// @Param id path string true "the org's id"
func DeleteOrg(c *gin.Context) {
_store := store.FromContext(c)
+ org := session.Org(c)
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
-
- err = _store.OrgDelete(orgID)
- if err != nil {
+ if err := _store.OrgDelete(org.ID); err != nil {
handleDBError(c, err)
return
}
diff --git a/server/api/org_registry.go b/server/api/org_registry.go
index b52782675..6476e2c53 100644
--- a/server/api/org_registry.go
+++ b/server/api/org_registry.go
@@ -16,7 +16,6 @@ package api
import (
"net/http"
- "strconv"
"github.com/gin-gonic/gin"
@@ -36,16 +35,11 @@ import (
// @Param org_id path string true "the org's id"
// @Param registry path string true "the registry's address"
func GetOrgRegistry(c *gin.Context) {
+ org := session.Org(c)
addr := c.Param("registry")
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
-
registryService := server.Config.Services.Manager.RegistryService()
- registry, err := registryService.OrgRegistryFind(orgID, addr)
+ registry, err := registryService.OrgRegistryFind(org.ID, addr)
if err != nil {
handleDBError(c, err)
return
@@ -65,16 +59,12 @@ func GetOrgRegistry(c *gin.Context) {
// @Param page query int false "for response pagination, page offset number" default(1)
// @Param perPage query int false "for response pagination, max items per page" default(50)
func GetOrgRegistryList(c *gin.Context) {
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
+ org := session.Org(c)
registryService := server.Config.Services.Manager.RegistryService()
- list, err := registryService.OrgRegistryList(orgID, session.Pagination(c))
+ list, err := registryService.OrgRegistryList(org.ID, session.Pagination(c))
if err != nil {
- c.String(http.StatusInternalServerError, "Error getting registry list for %q. %s", orgID, err)
+ c.String(http.StatusInternalServerError, "Error getting registry list for %q. %s", org.ID, err)
return
}
// copy the registry detail to remove the sensitive
@@ -96,31 +86,27 @@ func GetOrgRegistryList(c *gin.Context) {
// @Param org_id path string true "the org's id"
// @Param registryData body Registry true "the new registry"
func PostOrgRegistry(c *gin.Context) {
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
+ org := session.Org(c)
in := new(model.Registry)
if err := c.Bind(in); err != nil {
- c.String(http.StatusBadRequest, "Error parsing org %q registry. %s", orgID, err)
+ c.String(http.StatusBadRequest, "Error parsing org %q registry. %s", org.ID, err)
return
}
registry := &model.Registry{
- OrgID: orgID,
+ OrgID: org.ID,
Address: in.Address,
Username: in.Username,
Password: in.Password,
}
if err := registry.Validate(); err != nil {
- c.String(http.StatusUnprocessableEntity, "Error inserting org %q registry. %s", orgID, err)
+ c.String(http.StatusUnprocessableEntity, "Error inserting org %q registry. %s", org.ID, err)
return
}
registryService := server.Config.Services.Manager.RegistryService()
- if err := registryService.OrgRegistryCreate(orgID, registry); err != nil {
- c.String(http.StatusInternalServerError, "Error inserting org %q registry %q. %s", orgID, in.Address, err)
+ if err := registryService.OrgRegistryCreate(org.ID, registry); err != nil {
+ c.String(http.StatusInternalServerError, "Error inserting org %q registry %q. %s", org.ID, in.Address, err)
return
}
c.JSON(http.StatusOK, registry.Copy())
@@ -138,22 +124,17 @@ func PostOrgRegistry(c *gin.Context) {
// @Param registry path string true "the registry's name"
// @Param registryData body Registry true "the update registry data"
func PatchOrgRegistry(c *gin.Context) {
+ org := session.Org(c)
addr := c.Param("registry")
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
in := new(model.Registry)
- err = c.Bind(in)
- if err != nil {
+ if err := c.Bind(in); err != nil {
c.String(http.StatusBadRequest, "Error parsing registry. %s", err)
return
}
registryService := server.Config.Services.Manager.RegistryService()
- registry, err := registryService.OrgRegistryFind(orgID, addr)
+ registry, err := registryService.OrgRegistryFind(org.ID, addr)
if err != nil {
handleDBError(c, err)
return
@@ -169,12 +150,12 @@ func PatchOrgRegistry(c *gin.Context) {
}
if err := registry.Validate(); err != nil {
- c.String(http.StatusUnprocessableEntity, "Error updating org %q registry. %s", orgID, err)
+ c.String(http.StatusUnprocessableEntity, "Error updating org %q registry. %s", org.ID, err)
return
}
- if err := registryService.OrgRegistryUpdate(orgID, registry); err != nil {
- c.String(http.StatusInternalServerError, "Error updating org %q registry %q. %s", orgID, in.Address, err)
+ if err := registryService.OrgRegistryUpdate(org.ID, registry); err != nil {
+ c.String(http.StatusInternalServerError, "Error updating org %q registry %q. %s", org.ID, in.Address, err)
return
}
c.JSON(http.StatusOK, registry.Copy())
@@ -191,15 +172,11 @@ func PatchOrgRegistry(c *gin.Context) {
// @Param org_id path string true "the org's id"
// @Param registry path string true "the registry's name"
func DeleteOrgRegistry(c *gin.Context) {
+ org := session.Org(c)
addr := c.Param("registry")
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
registryService := server.Config.Services.Manager.RegistryService()
- if err := registryService.OrgRegistryDelete(orgID, addr); err != nil {
+ if err := registryService.OrgRegistryDelete(org.ID, addr); err != nil {
handleDBError(c, err)
return
}
diff --git a/server/api/org_secret.go b/server/api/org_secret.go
index 98f67e089..c892e8780 100644
--- a/server/api/org_secret.go
+++ b/server/api/org_secret.go
@@ -16,7 +16,6 @@ package api
import (
"net/http"
- "strconv"
"github.com/gin-gonic/gin"
@@ -36,16 +35,11 @@ import (
// @Param org_id path string true "the org's id"
// @Param secret path string true "the secret's name"
func GetOrgSecret(c *gin.Context) {
+ org := session.Org(c)
name := c.Param("secret")
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
-
secretService := server.Config.Services.Manager.SecretService()
- secret, err := secretService.OrgSecretFind(orgID, name)
+ secret, err := secretService.OrgSecretFind(org.ID, name)
if err != nil {
handleDBError(c, err)
return
@@ -65,16 +59,12 @@ func GetOrgSecret(c *gin.Context) {
// @Param page query int false "for response pagination, page offset number" default(1)
// @Param perPage query int false "for response pagination, max items per page" default(50)
func GetOrgSecretList(c *gin.Context) {
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
+ org := session.Org(c)
secretService := server.Config.Services.Manager.SecretService()
- list, err := secretService.OrgSecretList(orgID, session.Pagination(c))
+ list, err := secretService.OrgSecretList(org.ID, session.Pagination(c))
if err != nil {
- c.String(http.StatusInternalServerError, "Error getting secret list for %q. %s", orgID, err)
+ c.String(http.StatusInternalServerError, "Error getting secret list for %q. %s", org.ID, err)
return
}
// copy the secret detail to remove the sensitive
@@ -96,32 +86,28 @@ func GetOrgSecretList(c *gin.Context) {
// @Param org_id path string true "the org's id"
// @Param secretData body Secret true "the new secret"
func PostOrgSecret(c *gin.Context) {
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
+ org := session.Org(c)
in := new(model.Secret)
if err := c.Bind(in); err != nil {
- c.String(http.StatusBadRequest, "Error parsing org %q secret. %s", orgID, err)
+ c.String(http.StatusBadRequest, "Error parsing org %q secret. %s", org.ID, err)
return
}
secret := &model.Secret{
- OrgID: orgID,
+ OrgID: org.ID,
Name: in.Name,
Value: in.Value,
Events: in.Events,
Images: in.Images,
}
if err := secret.Validate(); err != nil {
- c.String(http.StatusUnprocessableEntity, "Error inserting org %q secret. %s", orgID, err)
+ c.String(http.StatusUnprocessableEntity, "Error inserting org %q secret. %s", org.ID, err)
return
}
secretService := server.Config.Services.Manager.SecretService()
- if err := secretService.OrgSecretCreate(orgID, secret); err != nil {
- c.String(http.StatusInternalServerError, "Error inserting org %q secret %q. %s", orgID, in.Name, err)
+ if err := secretService.OrgSecretCreate(org.ID, secret); err != nil {
+ c.String(http.StatusInternalServerError, "Error inserting org %q secret %q. %s", org.ID, in.Name, err)
return
}
c.JSON(http.StatusOK, secret.Copy())
@@ -139,22 +125,17 @@ func PostOrgSecret(c *gin.Context) {
// @Param secret path string true "the secret's name"
// @Param secretData body Secret true "the update secret data"
func PatchOrgSecret(c *gin.Context) {
+ org := session.Org(c)
name := c.Param("secret")
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
in := new(model.Secret)
- err = c.Bind(in)
- if err != nil {
+ if err := c.Bind(in); err != nil {
c.String(http.StatusBadRequest, "Error parsing secret. %s", err)
return
}
secretService := server.Config.Services.Manager.SecretService()
- secret, err := secretService.OrgSecretFind(orgID, name)
+ secret, err := secretService.OrgSecretFind(org.ID, name)
if err != nil {
handleDBError(c, err)
return
@@ -170,12 +151,12 @@ func PatchOrgSecret(c *gin.Context) {
}
if err := secret.Validate(); err != nil {
- c.String(http.StatusUnprocessableEntity, "Error updating org %q secret. %s", orgID, err)
+ c.String(http.StatusUnprocessableEntity, "Error updating org %q secret. %s", org.ID, err)
return
}
- if err := secretService.OrgSecretUpdate(orgID, secret); err != nil {
- c.String(http.StatusInternalServerError, "Error updating org %q secret %q. %s", orgID, in.Name, err)
+ if err := secretService.OrgSecretUpdate(org.ID, secret); err != nil {
+ c.String(http.StatusInternalServerError, "Error updating org %q secret %q. %s", org.ID, in.Name, err)
return
}
c.JSON(http.StatusOK, secret.Copy())
@@ -192,15 +173,11 @@ func PatchOrgSecret(c *gin.Context) {
// @Param org_id path string true "the org's id"
// @Param secret path string true "the secret's name"
func DeleteOrgSecret(c *gin.Context) {
+ org := session.Org(c)
name := c.Param("secret")
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
secretService := server.Config.Services.Manager.SecretService()
- if err := secretService.OrgSecretDelete(orgID, name); err != nil {
+ if err := secretService.OrgSecretDelete(org.ID, name); err != nil {
handleDBError(c, err)
return
}
diff --git a/server/api/pipeline.go b/server/api/pipeline.go
index f1e4b41a0..a1b191ab4 100644
--- a/server/api/pipeline.go
+++ b/server/api/pipeline.go
@@ -30,8 +30,10 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/server"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
"go.woodpecker-ci.org/woodpecker/v2/server/pipeline"
+ "go.woodpecker-ci.org/woodpecker/v2/server/pipeline/stepbuilder"
"go.woodpecker-ci.org/woodpecker/v2/server/router/middleware/session"
"go.woodpecker-ci.org/woodpecker/v2/server/store"
+ "go.woodpecker-ci.org/woodpecker/v2/server/store/types"
)
// CreatePipeline
@@ -392,6 +394,47 @@ func GetPipelineConfig(c *gin.Context) {
c.JSON(http.StatusOK, configs)
}
+// GetPipelineMetadata
+//
+// @Summary Get metadata for a pipeline or a specific workflow, including previous pipeline info
+// @Router /repos/{repo_id}/pipelines/{number}/metadata [get]
+// @Produce json
+// @Success 200 {object} metadata.Metadata
+// @Tags Pipelines
+// @Param Authorization header string true "Insert your personal access token" default(Bearer )
+// @Param repo_id path int true "the repository id"
+// @Param number path int true "the number of the pipeline"
+func GetPipelineMetadata(c *gin.Context) {
+ repo := session.Repo(c)
+ num, err := strconv.ParseInt(c.Param("number"), 10, 64)
+ if err != nil {
+ _ = c.AbortWithError(http.StatusBadRequest, err)
+ return
+ }
+
+ _store := store.FromContext(c)
+ currentPipeline, err := _store.GetPipelineNumber(repo, num)
+ if err != nil {
+ handleDBError(c, err)
+ return
+ }
+
+ forge, err := server.Config.Services.Manager.ForgeFromRepo(repo)
+ if err != nil {
+ c.AbortWithStatus(http.StatusInternalServerError)
+ return
+ }
+
+ prevPipeline, err := _store.GetPipelineLastBefore(repo, currentPipeline.Branch, currentPipeline.ID)
+ if err != nil && !errors.Is(err, types.RecordNotExist) {
+ handleDBError(c, err)
+ return
+ }
+
+ metadata := stepbuilder.MetadataFromStruct(forge, repo, currentPipeline, prevPipeline, nil, server.Config.Server.Host)
+ c.JSON(http.StatusOK, metadata)
+}
+
// CancelPipeline
//
// @Summary Cancel a pipeline
diff --git a/server/api/pipeline_test.go b/server/api/pipeline_test.go
index d66301170..80e2e7965 100644
--- a/server/api/pipeline_test.go
+++ b/server/api/pipeline_test.go
@@ -1,129 +1,217 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
package api
import (
+ "encoding/json"
"net/http"
"net/http/httptest"
"testing"
- "github.com/franela/goblin"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/metadata"
+ "go.woodpecker-ci.org/woodpecker/v2/server"
+ forge_mocks "go.woodpecker-ci.org/woodpecker/v2/server/forge/mocks"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
- "go.woodpecker-ci.org/woodpecker/v2/server/store/mocks"
+ mocks_manager "go.woodpecker-ci.org/woodpecker/v2/server/services/mocks"
+ store_mocks "go.woodpecker-ci.org/woodpecker/v2/server/store/mocks"
+ "go.woodpecker-ci.org/woodpecker/v2/server/store/types"
)
var fakePipeline = &model.Pipeline{
+ ID: 2,
+ Number: 2,
Status: model.StatusSuccess,
}
func TestGetPipelines(t *testing.T) {
gin.SetMode(gin.TestMode)
- g := goblin.Goblin(t)
- g.Describe("Pipeline", func() {
- g.It("should get pipelines", func() {
- pipelines := []*model.Pipeline{fakePipeline}
+ t.Run("should get pipelines", func(t *testing.T) {
+ pipelines := []*model.Pipeline{fakePipeline}
- mockStore := mocks.NewStore(t)
- mockStore.On("GetPipelineList", mock.Anything, mock.Anything, mock.Anything).Return(pipelines, nil)
+ mockStore := store_mocks.NewStore(t)
+ mockStore.On("GetPipelineList", mock.Anything, mock.Anything, mock.Anything).Return(pipelines, nil)
- w := httptest.NewRecorder()
- c, _ := gin.CreateTestContext(w)
- c.Set("store", mockStore)
+ w := httptest.NewRecorder()
+ c, _ := gin.CreateTestContext(w)
+ c.Set("store", mockStore)
- GetPipelines(c)
+ GetPipelines(c)
- mockStore.AssertCalled(t, "GetPipelineList", mock.Anything, mock.Anything, mock.Anything)
- assert.Equal(t, http.StatusOK, c.Writer.Status())
- })
+ mockStore.AssertCalled(t, "GetPipelineList", mock.Anything, mock.Anything, mock.Anything)
+ assert.Equal(t, http.StatusOK, c.Writer.Status())
+ })
- g.It("should not parse pipeline filter", func() {
- c, _ := gin.CreateTestContext(httptest.NewRecorder())
- c.Request, _ = http.NewRequest(http.MethodDelete, "/?before=2023-01-16&after=2023-01-15", nil)
+ t.Run("should not parse pipeline filter", func(t *testing.T) {
+ c, _ := gin.CreateTestContext(httptest.NewRecorder())
+ c.Request, _ = http.NewRequest(http.MethodDelete, "/?before=2023-01-16&after=2023-01-15", nil)
- GetPipelines(c)
+ GetPipelines(c)
- assert.Equal(t, http.StatusBadRequest, c.Writer.Status())
- })
+ assert.Equal(t, http.StatusBadRequest, c.Writer.Status())
+ })
- g.It("should parse pipeline filter", func() {
- pipelines := []*model.Pipeline{fakePipeline}
+ t.Run("should parse pipeline filter", func(t *testing.T) {
+ pipelines := []*model.Pipeline{fakePipeline}
- mockStore := mocks.NewStore(t)
- mockStore.On("GetPipelineList", mock.Anything, mock.Anything, mock.Anything).Return(pipelines, nil)
+ mockStore := store_mocks.NewStore(t)
+ mockStore.On("GetPipelineList", mock.Anything, mock.Anything, mock.Anything).Return(pipelines, nil)
- c, _ := gin.CreateTestContext(httptest.NewRecorder())
- c.Set("store", mockStore)
- c.Request, _ = http.NewRequest(http.MethodDelete, "/?2023-01-16T15:00:00Z&after=2023-01-15T15:00:00Z", nil)
+ c, _ := gin.CreateTestContext(httptest.NewRecorder())
+ c.Set("store", mockStore)
+ c.Request, _ = http.NewRequest(http.MethodDelete, "/?2023-01-16T15:00:00Z&after=2023-01-15T15:00:00Z", nil)
- GetPipelines(c)
+ GetPipelines(c)
- assert.Equal(t, http.StatusOK, c.Writer.Status())
- })
+ assert.Equal(t, http.StatusOK, c.Writer.Status())
+ })
- g.It("should parse pipeline filter with tz offset", func() {
- pipelines := []*model.Pipeline{fakePipeline}
+ t.Run("should parse pipeline filter with tz offset", func(t *testing.T) {
+ pipelines := []*model.Pipeline{fakePipeline}
- mockStore := mocks.NewStore(t)
- mockStore.On("GetPipelineList", mock.Anything, mock.Anything, mock.Anything).Return(pipelines, nil)
+ mockStore := store_mocks.NewStore(t)
+ mockStore.On("GetPipelineList", mock.Anything, mock.Anything, mock.Anything).Return(pipelines, nil)
- c, _ := gin.CreateTestContext(httptest.NewRecorder())
- c.Set("store", mockStore)
- c.Request, _ = http.NewRequest(http.MethodDelete, "/?before=2023-01-16T15:00:00%2B01:00&after=2023-01-15T15:00:00%2B01:00", nil)
+ c, _ := gin.CreateTestContext(httptest.NewRecorder())
+ c.Set("store", mockStore)
+ c.Request, _ = http.NewRequest(http.MethodDelete, "/?before=2023-01-16T15:00:00%2B01:00&after=2023-01-15T15:00:00%2B01:00", nil)
- GetPipelines(c)
+ GetPipelines(c)
- assert.Equal(t, http.StatusOK, c.Writer.Status())
- })
+ assert.Equal(t, http.StatusOK, c.Writer.Status())
})
}
func TestDeletePipeline(t *testing.T) {
gin.SetMode(gin.TestMode)
- g := goblin.Goblin(t)
- g.Describe("Pipeline", func() {
- g.It("should delete pipeline", func() {
- mockStore := mocks.NewStore(t)
- mockStore.On("GetPipelineNumber", mock.Anything, mock.Anything).Return(fakePipeline, nil)
- mockStore.On("DeletePipeline", mock.Anything).Return(nil)
+ t.Run("should delete pipeline", func(t *testing.T) {
+ mockStore := store_mocks.NewStore(t)
+ mockStore.On("GetPipelineNumber", mock.Anything, mock.Anything).Return(fakePipeline, nil)
+ mockStore.On("DeletePipeline", mock.Anything).Return(nil)
- c, _ := gin.CreateTestContext(httptest.NewRecorder())
+ c, _ := gin.CreateTestContext(httptest.NewRecorder())
+ c.Set("store", mockStore)
+ c.Params = gin.Params{{Key: "number", Value: "2"}}
+
+ DeletePipeline(c)
+
+ mockStore.AssertCalled(t, "GetPipelineNumber", mock.Anything, mock.Anything)
+ mockStore.AssertCalled(t, "DeletePipeline", mock.Anything)
+ assert.Equal(t, http.StatusNoContent, c.Writer.Status())
+ })
+
+ t.Run("should not delete without pipeline number", func(t *testing.T) {
+ c, _ := gin.CreateTestContext(httptest.NewRecorder())
+
+ DeletePipeline(c)
+
+ assert.Equal(t, http.StatusBadRequest, c.Writer.Status())
+ })
+
+ t.Run("should not delete pending", func(t *testing.T) {
+ fakePipeline := *fakePipeline
+ fakePipeline.Status = model.StatusPending
+
+ mockStore := store_mocks.NewStore(t)
+ mockStore.On("GetPipelineNumber", mock.Anything, mock.Anything).Return(&fakePipeline, nil)
+
+ c, _ := gin.CreateTestContext(httptest.NewRecorder())
+ c.Set("store", mockStore)
+ c.Params = gin.Params{{Key: "number", Value: "2"}}
+
+ DeletePipeline(c)
+
+ mockStore.AssertCalled(t, "GetPipelineNumber", mock.Anything, mock.Anything)
+ mockStore.AssertNotCalled(t, "DeletePipeline", mock.Anything)
+ assert.Equal(t, http.StatusUnprocessableEntity, c.Writer.Status())
+ })
+}
+
+func TestGetPipelineMetadata(t *testing.T) {
+ gin.SetMode(gin.TestMode)
+
+ prevPipeline := &model.Pipeline{
+ ID: 1,
+ Number: 1,
+ Status: model.StatusFailure,
+ }
+
+ fakeRepo := &model.Repo{ID: 1}
+
+ mockForge := forge_mocks.NewForge(t)
+ mockForge.On("Name").Return("mock")
+ mockForge.On("URL").Return("https://codeberg.org")
+
+ mockManager := mocks_manager.NewManager(t)
+ mockManager.On("ForgeFromRepo", fakeRepo).Return(mockForge, nil)
+ server.Config.Services.Manager = mockManager
+
+ mockStore := store_mocks.NewStore(t)
+ mockStore.On("GetPipelineNumber", mock.Anything, int64(2)).Return(fakePipeline, nil)
+ mockStore.On("GetPipelineLastBefore", mock.Anything, mock.Anything, int64(2)).Return(prevPipeline, nil)
+
+ t.Run("PipelineMetadata", func(t *testing.T) {
+ t.Run("should get pipeline metadata", func(t *testing.T) {
+ w := httptest.NewRecorder()
+ c, _ := gin.CreateTestContext(w)
+ c.Params = gin.Params{{Key: "number", Value: "2"}}
c.Set("store", mockStore)
- c.Params = gin.Params{{Key: "number", Value: "1"}}
+ c.Set("forge", mockForge)
+ c.Set("repo", fakeRepo)
- DeletePipeline(c)
+ GetPipelineMetadata(c)
- mockStore.AssertCalled(t, "GetPipelineNumber", mock.Anything, mock.Anything)
- mockStore.AssertCalled(t, "DeletePipeline", mock.Anything)
- assert.Equal(t, http.StatusNoContent, c.Writer.Status())
+ assert.Equal(t, http.StatusOK, w.Code)
+
+ var response metadata.Metadata
+ err := json.Unmarshal(w.Body.Bytes(), &response)
+ assert.NoError(t, err)
+
+ assert.Equal(t, int64(1), response.Repo.ID)
+ assert.Equal(t, int64(2), response.Curr.Number)
+ assert.Equal(t, int64(1), response.Prev.Number)
})
- g.It("should not delete without pipeline number", func() {
- c, _ := gin.CreateTestContext(httptest.NewRecorder())
+ t.Run("should return bad request for invalid pipeline number", func(t *testing.T) {
+ w := httptest.NewRecorder()
+ c, _ := gin.CreateTestContext(w)
+ c.Params = gin.Params{{Key: "number", Value: "invalid"}}
- DeletePipeline(c)
+ GetPipelineMetadata(c)
- assert.Equal(t, http.StatusBadRequest, c.Writer.Status())
+ assert.Equal(t, http.StatusBadRequest, w.Code)
})
- g.It("should not delete pending", func() {
- fakePipeline.Status = model.StatusPending
+ t.Run("should return not found for non-existent pipeline", func(t *testing.T) {
+ mockStore := store_mocks.NewStore(t)
+ mockStore.On("GetPipelineNumber", mock.Anything, int64(3)).Return((*model.Pipeline)(nil), types.RecordNotExist)
- mockStore := mocks.NewStore(t)
- mockStore.On("GetPipelineNumber", mock.Anything, mock.Anything).Return(fakePipeline, nil)
-
- c, _ := gin.CreateTestContext(httptest.NewRecorder())
+ w := httptest.NewRecorder()
+ c, _ := gin.CreateTestContext(w)
+ c.Params = gin.Params{{Key: "number", Value: "3"}}
c.Set("store", mockStore)
- c.Params = gin.Params{{Key: "number", Value: "1"}}
+ c.Set("repo", fakeRepo)
- DeletePipeline(c)
+ GetPipelineMetadata(c)
- mockStore.AssertCalled(t, "GetPipelineNumber", mock.Anything, mock.Anything)
- mockStore.AssertNotCalled(t, "DeletePipeline", mock.Anything)
- assert.Equal(t, http.StatusUnprocessableEntity, c.Writer.Status())
+ assert.Equal(t, http.StatusNotFound, w.Code)
})
})
}
diff --git a/server/api/repo.go b/server/api/repo.go
index b5cefa699..8d4d9d5f0 100644
--- a/server/api/repo.go
+++ b/server/api/repo.go
@@ -28,6 +28,7 @@ import (
"github.com/rs/zerolog/log"
"go.woodpecker-ci.org/woodpecker/v2/server"
+ "go.woodpecker-ci.org/woodpecker/v2/server/forge"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
"go.woodpecker-ci.org/woodpecker/v2/server/router/middleware/session"
"go.woodpecker-ci.org/woodpecker/v2/server/store"
@@ -224,10 +225,23 @@ func PatchRepo(c *gin.Context) {
c.String(http.StatusForbidden, fmt.Sprintf("Timeout is not allowed to be higher than max timeout (%d min)", server.Config.Pipeline.MaxTimeout))
return
}
- if in.IsTrusted != nil && *in.IsTrusted != repo.IsTrusted && !user.Admin {
- log.Trace().Msgf("user '%s' wants to make repo trusted without being an instance admin", user.Login)
- c.String(http.StatusForbidden, "Insufficient privileges")
- return
+
+ if in.Trusted != nil {
+ if (*in.Trusted.Network != repo.Trusted.Network || *in.Trusted.Volumes != repo.Trusted.Volumes || *in.Trusted.Security != repo.Trusted.Security) && !user.Admin {
+ log.Trace().Msgf("user '%s' wants to change trusted without being an instance admin", user.Login)
+ c.String(http.StatusForbidden, "Insufficient privileges")
+ return
+ }
+
+ if in.Trusted.Network != nil {
+ repo.Trusted.Network = *in.Trusted.Network
+ }
+ if in.Trusted.Security != nil {
+ repo.Trusted.Security = *in.Trusted.Security
+ }
+ if in.Trusted.Volumes != nil {
+ repo.Trusted.Volumes = *in.Trusted.Volumes
+ }
}
if in.AllowPull != nil {
@@ -239,9 +253,6 @@ func PatchRepo(c *gin.Context) {
if in.IsGated != nil {
repo.IsGated = *in.IsGated
}
- if in.IsTrusted != nil {
- repo.IsTrusted = *in.IsTrusted
- }
if in.Timeout != nil {
repo.Timeout = *in.Timeout
}
@@ -349,6 +360,7 @@ func GetRepoPermissions(c *gin.Context) {
// @Param page query int false "for response pagination, page offset number" default(1)
// @Param perPage query int false "for response pagination, max items per page" default(50)
func GetRepoBranches(c *gin.Context) {
+ _store := store.FromContext(c)
repo := session.Repo(c)
user := session.User(c)
_forge, err := server.Config.Services.Manager.ForgeFromRepo(repo)
@@ -358,9 +370,12 @@ func GetRepoBranches(c *gin.Context) {
return
}
+ forge.Refresh(c, _forge, _store, user)
+
branches, err := _forge.Branches(c, user, repo, session.Pagination(c))
if err != nil {
- _ = c.AbortWithError(http.StatusInternalServerError, err)
+ log.Error().Err(err).Msg("failed to load branches")
+ c.String(http.StatusInternalServerError, "failed to load branches: %s", err)
return
}
@@ -379,6 +394,7 @@ func GetRepoBranches(c *gin.Context) {
// @Param page query int false "for response pagination, page offset number" default(1)
// @Param perPage query int false "for response pagination, max items per page" default(50)
func GetRepoPullRequests(c *gin.Context) {
+ _store := store.FromContext(c)
repo := session.Repo(c)
user := session.User(c)
_forge, err := server.Config.Services.Manager.ForgeFromRepo(repo)
@@ -388,6 +404,8 @@ func GetRepoPullRequests(c *gin.Context) {
return
}
+ forge.Refresh(c, _forge, _store, user)
+
prs, err := _forge.PullRequests(c, user, repo, session.Pagination(c))
if err != nil {
_ = c.AbortWithError(http.StatusInternalServerError, err)
@@ -614,10 +632,14 @@ func repairRepo(c *gin.Context, repo *model.Repo, withPerms, skipOnErr bool) {
user, err := _store.GetUser(repo.UserID)
if err != nil {
if errors.Is(err, types.RecordNotExist) {
- if !skipOnErr {
- c.AbortWithStatus(http.StatusNotFound)
+ oldUserID := repo.UserID
+ user = session.User(c)
+ repo.UserID = user.ID
+ err = _store.UpdateRepo(repo)
+ if err != nil {
+ _ = c.AbortWithError(http.StatusInternalServerError, err)
}
- log.Error().Err(err).Msg("could not get user on repo repair")
+ log.Debug().Msgf("Could not find repo user with ID %d during repo repair, set to repair request user with ID %d", oldUserID, user.ID)
} else {
_ = c.AbortWithError(http.StatusInternalServerError, err)
}
diff --git a/server/api/stream.go b/server/api/stream.go
index 2d3c7ee86..a620dd068 100644
--- a/server/api/stream.go
+++ b/server/api/stream.go
@@ -28,12 +28,19 @@ import (
"github.com/rs/zerolog/log"
"go.woodpecker-ci.org/woodpecker/v2/server"
+ "go.woodpecker-ci.org/woodpecker/v2/server/logging"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
"go.woodpecker-ci.org/woodpecker/v2/server/pubsub"
"go.woodpecker-ci.org/woodpecker/v2/server/router/middleware/session"
"go.woodpecker-ci.org/woodpecker/v2/server/store"
)
+const (
+ // How many batches of logs to keep for each client before starting to
+ // drop them if the client is not consuming them faster than they arrive.
+ maxQueuedBatchesPerClient int = 30
+)
+
// EventStreamSSE
//
// @Summary Stream events like pipeline updates
@@ -213,17 +220,32 @@ func LogStreamSSE(c *gin.Context) {
}
go func() {
- err := server.Config.Services.Logs.Tail(ctx, step.ID, func(entries ...*model.LogEntry) {
- for _, entry := range entries {
- select {
- case <-ctx.Done():
- return
- default:
- ee, _ := json.Marshal(entry)
- logChan <- ee
+ batches := make(logging.LogChan, maxQueuedBatchesPerClient)
+
+ go func() {
+ defer func() {
+ if r := recover(); r != nil {
+ log.Error().Msgf("error sending log message: %v", r)
+ }
+ }()
+
+ for entries := range batches {
+ for _, entry := range entries {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ if ee, err := json.Marshal(entry); err == nil {
+ logChan <- ee
+ } else {
+ log.Error().Err(err).Msg("unable to serialize log entry")
+ }
+ }
}
}
- })
+ }()
+
+ err := server.Config.Services.Logs.Tail(ctx, step.ID, batches)
if err != nil {
log.Error().Err(err).Msg("tail of logs failed")
}
diff --git a/server/config.go b/server/config.go
index bb5ba721e..fb6c42292 100644
--- a/server/config.go
+++ b/server/config.go
@@ -64,11 +64,11 @@ var Config = struct {
Pipeline struct {
AuthenticatePublicRepos bool
DefaultCancelPreviousPipelineEvents []model.WebhookEvent
- DefaultCloneImage string
- Limits model.ResourceLimit
+ DefaultClonePlugin string
+ TrustedClonePlugins []string
Volumes []string
Networks []string
- Privileged []string
+ PrivilegedPlugins []string
DefaultTimeout int64
MaxTimeout int64
Proxy struct {
diff --git a/server/cron/cron.go b/server/cron/cron.go
index 0dc05ee65..9fa35aa8c 100644
--- a/server/cron/cron.go
+++ b/server/cron/cron.go
@@ -19,7 +19,7 @@ import (
"fmt"
"time"
- "github.com/robfig/cron"
+ "github.com/gdgvda/cron"
"github.com/rs/zerolog/log"
"go.woodpecker-ci.org/woodpecker/v2/server"
@@ -31,7 +31,7 @@ import (
const (
// Specifies the interval woodpecker checks for new crons to exec.
- checkTime = 10 * time.Second
+ checkTime = time.Minute
// Specifies the batch size of crons to retrieve per check from database.
checkItems = 10
@@ -71,7 +71,7 @@ func CalcNewNext(schedule string, now time.Time) (time.Time, error) {
// TODO: allow the users / the admin to set a specific timezone
- c, err := cron.Parse(schedule)
+ c, err := cron.ParseStandard(schedule)
if err != nil {
return time.Time{}, fmt.Errorf("cron parse schedule: %w", err)
}
diff --git a/server/forge/bitbucket/bitbucket.go b/server/forge/bitbucket/bitbucket.go
index 2fc95a8d1..4712a613d 100644
--- a/server/forge/bitbucket/bitbucket.go
+++ b/server/forge/bitbucket/bitbucket.go
@@ -313,7 +313,7 @@ func (c *config) Activate(ctx context.Context, u *model.User, r *model.Repo, lin
return c.newClient(ctx, u).CreateHook(r.Owner, r.Name, &internal.Hook{
Active: true,
Desc: rawURL.Host,
- Events: []string{"repo:push", "pullrequest:created"},
+ Events: []string{"repo:push", "pullrequest:created", "pullrequest:updated", "pullrequest:fulfilled", "pullrequest:rejected"},
URL: link,
})
}
diff --git a/server/forge/bitbucket/convert.go b/server/forge/bitbucket/convert.go
index af573cbff..6dc8f1fb1 100644
--- a/server/forge/bitbucket/convert.go
+++ b/server/forge/bitbucket/convert.go
@@ -168,22 +168,30 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline {
event = model.EventPullClosed
}
- return &model.Pipeline{
+ pipeline := &model.Pipeline{
Event: event,
- Commit: from.PullRequest.Dest.Commit.Hash,
- Ref: fmt.Sprintf("refs/heads/%s", from.PullRequest.Dest.Branch.Name),
+ Commit: from.PullRequest.Source.Commit.Hash,
+ Ref: fmt.Sprintf("refs/pull-requests/%d/from", from.PullRequest.ID),
Refspec: fmt.Sprintf("%s:%s",
from.PullRequest.Source.Branch.Name,
from.PullRequest.Dest.Branch.Name,
),
ForgeURL: from.PullRequest.Links.HTML.Href,
- Branch: from.PullRequest.Dest.Branch.Name,
- Message: from.PullRequest.Desc,
+ Branch: from.PullRequest.Source.Branch.Name,
+ Message: from.PullRequest.Title,
Avatar: from.Actor.Links.Avatar.Href,
Author: from.Actor.Login,
Sender: from.Actor.Login,
Timestamp: from.PullRequest.Updated.UTC().Unix(),
}
+
+ if from.PullRequest.State == stateClosed {
+ pipeline.Commit = from.PullRequest.MergeCommit.Hash
+ pipeline.Ref = fmt.Sprintf("refs/heads/%s", from.PullRequest.Dest.Branch.Name)
+ pipeline.Branch = from.PullRequest.Dest.Branch.Name
+ }
+
+ return pipeline
}
// convertPushHook is a helper function used to convert a Bitbucket push
diff --git a/server/forge/bitbucket/convert_test.go b/server/forge/bitbucket/convert_test.go
index 2ce3e27f6..70dac2bae 100644
--- a/server/forge/bitbucket/convert_test.go
+++ b/server/forge/bitbucket/convert_test.go
@@ -129,20 +129,22 @@ func Test_helper(t *testing.T) {
hook.PullRequest.Dest.Repo.Links.HTML.Href = "https://bitbucket.org/foo/bar"
hook.PullRequest.Source.Branch.Name = "change"
hook.PullRequest.Source.Repo.FullName = "baz/bar"
+ hook.PullRequest.Source.Commit.Hash = "c8411d7"
hook.PullRequest.Links.HTML.Href = "https://bitbucket.org/foo/bar/pulls/5"
- hook.PullRequest.Desc = "updated README"
+ hook.PullRequest.Title = "updated README"
hook.PullRequest.Updated = time.Now()
+ hook.PullRequest.ID = 1
pipeline := convertPullHook(hook)
g.Assert(pipeline.Event).Equal(model.EventPull)
g.Assert(pipeline.Author).Equal(hook.Actor.Login)
g.Assert(pipeline.Avatar).Equal(hook.Actor.Links.Avatar.Href)
- g.Assert(pipeline.Commit).Equal(hook.PullRequest.Dest.Commit.Hash)
- g.Assert(pipeline.Branch).Equal(hook.PullRequest.Dest.Branch.Name)
+ g.Assert(pipeline.Commit).Equal(hook.PullRequest.Source.Commit.Hash)
+ g.Assert(pipeline.Branch).Equal(hook.PullRequest.Source.Branch.Name)
g.Assert(pipeline.ForgeURL).Equal(hook.PullRequest.Links.HTML.Href)
- g.Assert(pipeline.Ref).Equal("refs/heads/main")
+ g.Assert(pipeline.Ref).Equal("refs/pull-requests/1/from")
g.Assert(pipeline.Refspec).Equal("change:main")
- g.Assert(pipeline.Message).Equal(hook.PullRequest.Desc)
+ g.Assert(pipeline.Message).Equal(hook.PullRequest.Title)
g.Assert(pipeline.Timestamp).Equal(hook.PullRequest.Updated.Unix())
})
diff --git a/server/forge/bitbucket/internal/types.go b/server/forge/bitbucket/internal/types.go
index a5dc4acb4..bbb03ab1c 100644
--- a/server/forge/bitbucket/internal/types.go
+++ b/server/forge/bitbucket/internal/types.go
@@ -164,6 +164,10 @@ type PullRequestHook struct {
Created time.Time `json:"created_on"`
Updated time.Time `json:"updated_on"`
+ MergeCommit struct {
+ Hash string `json:"hash"`
+ } `json:"merge_commit"`
+
Source struct {
Repo Repo `json:"repository"`
Commit struct {
diff --git a/server/forge/bitbucket/parse_test.go b/server/forge/bitbucket/parse_test.go
index aa9b81117..a5562fc39 100644
--- a/server/forge/bitbucket/parse_test.go
+++ b/server/forge/bitbucket/parse_test.go
@@ -63,7 +63,7 @@ func Test_parser(t *testing.T) {
g.Assert(err).IsNil()
g.Assert(r.FullName).Equal("user_name/repo_name")
g.Assert(b.Event).Equal(model.EventPull)
- g.Assert(b.Commit).Equal("ce5965ddd289")
+ g.Assert(b.Commit).Equal("d3022fc0ca3d")
})
g.It("should return pull-request details for a pull-request merged payload", func() {
@@ -76,7 +76,7 @@ func Test_parser(t *testing.T) {
g.Assert(err).IsNil()
g.Assert(r.FullName).Equal("anbraten/test-2")
g.Assert(b.Event).Equal(model.EventPullClosed)
- g.Assert(b.Commit).Equal("6c5f0bc9b2aa")
+ g.Assert(b.Commit).Equal("006704dbeab2")
})
g.It("should return pull-request details for a pull-request closed payload", func() {
@@ -89,7 +89,7 @@ func Test_parser(t *testing.T) {
g.Assert(err).IsNil()
g.Assert(r.FullName).Equal("anbraten/test-2")
g.Assert(b.Event).Equal(model.EventPullClosed)
- g.Assert(b.Commit).Equal("006704dbeab2")
+ g.Assert(b.Commit).Equal("f90e18fc9d45")
})
})
diff --git a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go
index cd3b58bc4..b04abeeac 100644
--- a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go
+++ b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go
@@ -211,7 +211,7 @@ func (c *client) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error
}
opts := &bb.RepositorySearchOptions{Permission: bb.PermissionRepoWrite, ListOptions: bb.ListOptions{Limit: listLimit}}
- var all []*model.Repo
+ all := make([]*model.Repo, 0)
for {
repos, resp, err := bc.Projects.SearchRepositories(ctx, opts)
if err != nil {
@@ -277,7 +277,7 @@ func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model
}
opts := &bb.FilesListOptions{At: p.Commit}
- var all []*forge_types.FileMeta
+ all := make([]*forge_types.FileMeta, 0)
for {
list, resp, err := bc.Projects.ListFiles(ctx, r.Owner, r.Name, path, opts)
if err != nil {
@@ -341,7 +341,7 @@ func (c *client) Branches(ctx context.Context, u *model.User, r *model.Repo, p *
}
opts := &bb.BranchSearchOptions{ListOptions: convertListOptions(p)}
- var all []string
+ all := make([]string, 0)
for {
branches, resp, err := bc.Projects.SearchBranches(ctx, r.Owner, r.Name, opts)
if err != nil {
@@ -389,7 +389,7 @@ func (c *client) PullRequests(ctx context.Context, u *model.User, r *model.Repo,
}
opts := &bb.PullRequestSearchOptions{ListOptions: convertListOptions(p)}
- var all []*model.PullRequest
+ all := make([]*model.PullRequest, 0)
for {
prs, resp, err := bc.Projects.SearchPullRequests(ctx, r.Owner, r.Name, opts)
if err != nil {
diff --git a/server/forge/gitea/parse.go b/server/forge/gitea/parse.go
index a8856a611..7b2629b2e 100644
--- a/server/forge/gitea/parse.go
+++ b/server/forge/gitea/parse.go
@@ -16,6 +16,7 @@
package gitea
import (
+ "fmt"
"io"
"net/http"
"strings"
@@ -111,6 +112,11 @@ func parsePullRequestHook(payload io.Reader) (*model.Repo, *model.Pipeline, erro
return nil, nil, err
}
+ if pr.PullRequest == nil {
+ // this should never have happened but it did - so we check
+ return nil, nil, fmt.Errorf("parsed pull_request webhook does not contain pull_request info")
+ }
+
// Don't trigger pipelines for non-code changes ...
if pr.Action != actionOpen && pr.Action != actionSync && pr.Action != actionClose {
log.Debug().Msgf("pull_request action is '%s' and no open or sync", pr.Action)
diff --git a/server/forge/github/convert.go b/server/forge/github/convert.go
index f6e9184e2..2047826ad 100644
--- a/server/forge/github/convert.go
+++ b/server/forge/github/convert.go
@@ -18,7 +18,7 @@ package github
import (
"fmt"
- "github.com/google/go-github/v63/github"
+ "github.com/google/go-github/v66/github"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
diff --git a/server/forge/github/convert_test.go b/server/forge/github/convert_test.go
index f589bcf57..605aa0452 100644
--- a/server/forge/github/convert_test.go
+++ b/server/forge/github/convert_test.go
@@ -19,7 +19,7 @@ import (
"testing"
"github.com/franela/goblin"
- "github.com/google/go-github/v63/github"
+ "github.com/google/go-github/v66/github"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
diff --git a/server/forge/github/fixtures/hooks.go b/server/forge/github/fixtures/hooks.go
index bae47d9e1..895c537ba 100644
--- a/server/forge/github/fixtures/hooks.go
+++ b/server/forge/github/fixtures/hooks.go
@@ -49,7 +49,7 @@ const HookPush = `{
"site_admin": false
},
"html_url": "https://github.com/woodpecker-ci/woodpecker",
- "description": "Woodpecker is a simple yet powerful CI/CD engine with great extensibility.",
+ "description": "Woodpecker is a simple, yet powerful CI/CD engine with great extensibility.",
"fork": false,
"url": "https://github.com/woodpecker-ci/woodpecker",
"forks_url": "https://api.github.com/repos/woodpecker-ci/woodpecker/forks",
@@ -152,7 +152,7 @@ const HookPush = `{
"members_url": "https://api.github.com/orgs/woodpecker-ci/members{/member}",
"public_members_url": "https://api.github.com/orgs/woodpecker-ci/public_members{/member}",
"avatar_url": "https://avatars.githubusercontent.com/u/84780935?v=4",
- "description": "Woodpecker is a simple yet powerful CI/CD engine with great extensibility."
+ "description": "Woodpecker is a simple, yet powerful CI/CD engine with great extensibility."
},
"sender": {
"login": "6543",
diff --git a/server/forge/github/github.go b/server/forge/github/github.go
index b8e02bd55..cf695b239 100644
--- a/server/forge/github/github.go
+++ b/server/forge/github/github.go
@@ -26,7 +26,7 @@ import (
"strconv"
"strings"
- "github.com/google/go-github/v63/github"
+ "github.com/google/go-github/v66/github"
"github.com/rs/zerolog/log"
"golang.org/x/oauth2"
diff --git a/server/forge/github/parse.go b/server/forge/github/parse.go
index 95702f376..e6fa7f068 100644
--- a/server/forge/github/parse.go
+++ b/server/forge/github/parse.go
@@ -22,7 +22,7 @@ import (
"net/http"
"strings"
- "github.com/google/go-github/v63/github"
+ "github.com/google/go-github/v66/github"
"go.woodpecker-ci.org/woodpecker/v2/server/forge/types"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go
index 793e81248..51d16bac3 100644
--- a/server/forge/gitlab/convert.go
+++ b/server/forge/gitlab/convert.go
@@ -124,6 +124,7 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, *
pipeline.Ref = fmt.Sprintf(mergeRefs, obj.IID)
pipeline.Branch = obj.SourceBranch
+ pipeline.Refspec = fmt.Sprintf("%s:%s", obj.SourceBranch, obj.TargetBranch)
author := lastCommit.Author
@@ -302,7 +303,9 @@ func extractFromPath(str string) (string, string, error) {
if len(s) < minPathComponents {
return "", "", fmt.Errorf("minimum match not found")
}
- return s[0], s[1], nil
+ owner := strings.Join(s[:len(s)-1], "/")
+ name := s[len(s)-1]
+ return owner, name, nil
}
func convertLabels(from []*gitlab.EventLabel) []string {
diff --git a/server/forge/gitlab/gitlab.go b/server/forge/gitlab/gitlab.go
index 1929aef66..e4fdc4cd3 100644
--- a/server/forge/gitlab/gitlab.go
+++ b/server/forge/gitlab/gitlab.go
@@ -541,7 +541,6 @@ func (g *GitLab) Deactivate(ctx context.Context, user *model.User, repo *model.R
return err
}
- hookID := -1
listProjectHooksOptions := &gitlab.ListProjectHooksOptions{
PerPage: perPage,
Page: 1,
@@ -553,13 +552,15 @@ func (g *GitLab) Deactivate(ctx context.Context, user *model.User, repo *model.R
}
for _, hook := range hooks {
- if hook.URL == webURL {
- hookID = hook.ID
- break
+ if strings.Contains(hook.URL, webURL) {
+ _, err = client.Projects.DeleteProjectHook(_repo.ID, hook.ID, gitlab.WithContext(ctx))
+ log.Info().Msg(fmt.Sprintf("successfully deleted hook with ID %d for repo %s", hook.ID, repo.FullName))
+ if err != nil {
+ return err
+ }
}
}
- // Exit the loop when we've seen all pages
if resp.CurrentPage >= resp.TotalPages {
break
}
@@ -568,13 +569,7 @@ func (g *GitLab) Deactivate(ctx context.Context, user *model.User, repo *model.R
listProjectHooksOptions.Page = resp.NextPage
}
- if hookID == -1 {
- return fmt.Errorf("could not find hook to delete")
- }
-
- _, err = client.Projects.DeleteProjectHook(_repo.ID, hookID, gitlab.WithContext(ctx))
-
- return err
+ return nil
}
// Branches returns the names of all branches for the named repository.
diff --git a/server/forge/gitlab/gitlab_test.go b/server/forge/gitlab/gitlab_test.go
index 5197b9d01..5e0a5afe6 100644
--- a/server/forge/gitlab/gitlab_test.go
+++ b/server/forge/gitlab/gitlab_test.go
@@ -300,3 +300,68 @@ func Test_GitLab(t *testing.T) {
})
})
}
+
+func TestExtractFromPath(t *testing.T) {
+ type testCase struct {
+ name string
+ input string
+ wantOwner string
+ wantName string
+ errContains string
+ }
+
+ tests := []testCase{
+ {
+ name: "basic two components",
+ input: "owner/repo",
+ wantOwner: "owner",
+ wantName: "repo",
+ },
+ {
+ name: "three components",
+ input: "owner/group/repo",
+ wantOwner: "owner/group",
+ wantName: "repo",
+ },
+ {
+ name: "many components",
+ input: "owner/group/subgroup/deep/repo",
+ wantOwner: "owner/group/subgroup/deep",
+ wantName: "repo",
+ },
+ {
+ name: "empty string",
+ input: "",
+ errContains: "minimum match not found",
+ },
+ {
+ name: "single component",
+ input: "onlyrepo",
+ errContains: "minimum match not found",
+ },
+ {
+ name: "trailing slash",
+ input: "owner/repo/",
+ wantOwner: "owner/repo",
+ wantName: "",
+ },
+ }
+
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ owner, name, err := extractFromPath(tc.input)
+
+ // Check error expectations
+ if tc.errContains != "" {
+ if assert.Error(t, err) {
+ assert.Contains(t, err.Error(), tc.errContains)
+ }
+ return
+ }
+
+ assert.NoError(t, err)
+ assert.EqualValues(t, tc.wantOwner, owner)
+ assert.EqualValues(t, tc.wantName, name)
+ })
+ }
+}
diff --git a/server/grpc/auth_server.go b/server/grpc/auth_server.go
index f9652c85f..a12317f93 100644
--- a/server/grpc/auth_server.go
+++ b/server/grpc/auth_server.go
@@ -60,13 +60,12 @@ func (s *WoodpeckerAuthServer) getAgent(agentID int64, agentToken string) (*mode
// global agent secret auth
if s.agentMasterToken != "" {
if agentToken == s.agentMasterToken && agentID == -1 {
- agent := new(model.Agent)
- agent.Name = ""
- agent.OwnerID = -1 // system agent
- agent.Token = s.agentMasterToken
- agent.Backend = ""
- agent.Platform = ""
- agent.Capacity = -1
+ agent := &model.Agent{
+ OwnerID: model.IDNotSet,
+ OrgID: model.IDNotSet,
+ Token: s.agentMasterToken,
+ Capacity: -1,
+ }
err := s.store.AgentCreate(agent)
if err != nil {
log.Error().Err(err).Msg("error creating system agent")
diff --git a/server/grpc/filter.go b/server/grpc/filter.go
index 9cf2d87fa..521aeb912 100644
--- a/server/grpc/filter.go
+++ b/server/grpc/filter.go
@@ -21,28 +21,32 @@ import (
)
func createFilterFunc(agentFilter rpc.Filter) queue.FilterFn {
- return func(task *model.Task) bool {
+ return func(task *model.Task) (bool, int) {
+ score := 0
for taskLabel, taskLabelValue := range task.Labels {
// if a task label is empty it will be ignored
if taskLabelValue == "" {
continue
}
+ // all task labels are required to be present for an agent to match
agentLabelValue, ok := agentFilter.Labels[taskLabel]
-
if !ok {
- return false
+ return false, 0
}
+ switch {
// if agent label has a wildcard
- if agentLabelValue == "*" {
- continue
- }
-
- if taskLabelValue != agentLabelValue {
- return false
+ case agentLabelValue == "*":
+ score++
+ // if agent label has an exact match
+ case agentLabelValue == taskLabelValue:
+ score += 10
+ // agent doesn't match
+ default:
+ return false, 0
}
}
- return true
+ return true, score
}
}
diff --git a/server/grpc/filter_test.go b/server/grpc/filter_test.go
index e4c7eeae6..e074f797f 100644
--- a/server/grpc/filter_test.go
+++ b/server/grpc/filter_test.go
@@ -24,68 +24,110 @@ import (
)
func TestCreateFilterFunc(t *testing.T) {
- t.Parallel()
-
tests := []struct {
name string
- agentLabels map[string]string
- task model.Task
- exp bool
+ agentFilter rpc.Filter
+ task *model.Task
+ wantMatched bool
+ wantScore int
}{
{
- name: "agent with missing labels",
- agentLabels: map[string]string{"repo": "test/woodpecker"},
- task: model.Task{
- Labels: map[string]string{"platform": "linux/amd64", "repo": "test/woodpecker"},
+ name: "Two exact matches",
+ agentFilter: rpc.Filter{
+ Labels: map[string]string{"org-id": "123", "platform": "linux"},
},
- exp: false,
+ task: &model.Task{
+ Labels: map[string]string{"org-id": "123", "platform": "linux"},
+ },
+ wantMatched: true,
+ wantScore: 20,
},
{
- name: "agent with wrong labels",
- agentLabels: map[string]string{"platform": "linux/arm64"},
- task: model.Task{
- Labels: map[string]string{"platform": "linux/amd64"},
+ name: "Wildcard and exact match",
+ agentFilter: rpc.Filter{
+ Labels: map[string]string{"org-id": "*", "platform": "linux"},
},
- exp: false,
+ task: &model.Task{
+ Labels: map[string]string{"org-id": "123", "platform": "linux"},
+ },
+ wantMatched: true,
+ wantScore: 11,
},
{
- name: "agent with correct labels",
- agentLabels: map[string]string{"platform": "linux/amd64", "location": "europe"},
- task: model.Task{
- Labels: map[string]string{"platform": "linux/amd64", "location": "europe"},
+ name: "Partial match",
+ agentFilter: rpc.Filter{
+ Labels: map[string]string{"org-id": "123", "platform": "linux"},
},
- exp: true,
+ task: &model.Task{
+ Labels: map[string]string{"org-id": "123", "platform": "windows"},
+ },
+ wantMatched: false,
+ wantScore: 0,
},
{
- name: "agent with additional labels",
- agentLabels: map[string]string{"platform": "linux/amd64", "location": "europe"},
- task: model.Task{
- Labels: map[string]string{"platform": "linux/amd64"},
+ name: "No match",
+ agentFilter: rpc.Filter{
+ Labels: map[string]string{"org-id": "456", "platform": "linux"},
},
- exp: true,
+ task: &model.Task{
+ Labels: map[string]string{"org-id": "123", "platform": "windows"},
+ },
+ wantMatched: false,
+ wantScore: 0,
},
{
- name: "agent with wildcard label",
- agentLabels: map[string]string{"platform": "linux/amd64", "location": "*"},
- task: model.Task{
- Labels: map[string]string{"platform": "linux/amd64", "location": "america"},
+ name: "Missing label",
+ agentFilter: rpc.Filter{
+ Labels: map[string]string{"platform": "linux"},
},
- exp: true,
+ task: &model.Task{
+ Labels: map[string]string{"needed": "some"},
+ },
+ wantMatched: false,
+ wantScore: 0,
},
{
- name: "agent with platform label and task without",
- agentLabels: map[string]string{"platform": "linux/amd64"},
- task: model.Task{
- Labels: map[string]string{"platform": ""},
+ name: "Empty task labels",
+ agentFilter: rpc.Filter{
+ Labels: map[string]string{"org-id": "123", "platform": "linux"},
},
- exp: true,
+ task: &model.Task{
+ Labels: map[string]string{},
+ },
+ wantMatched: true,
+ wantScore: 0,
+ },
+ {
+ name: "Agent with additional label",
+ agentFilter: rpc.Filter{
+ Labels: map[string]string{"org-id": "123", "platform": "linux", "extra": "value"},
+ },
+ task: &model.Task{
+ Labels: map[string]string{"org-id": "123", "platform": "linux", "empty": ""},
+ },
+ wantMatched: true,
+ wantScore: 20,
+ },
+ {
+ name: "Two wildcard matches",
+ agentFilter: rpc.Filter{
+ Labels: map[string]string{"org-id": "*", "platform": "*"},
+ },
+ task: &model.Task{
+ Labels: map[string]string{"org-id": "123", "platform": "linux"},
+ },
+ wantMatched: true,
+ wantScore: 2,
},
}
- for _, test := range tests {
- t.Run(test.name, func(t *testing.T) {
- fn := createFilterFunc(rpc.Filter{Labels: test.agentLabels})
- assert.EqualValues(t, test.exp, fn(&test.task))
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ filterFunc := createFilterFunc(tt.agentFilter)
+ gotMatched, gotScore := filterFunc(tt.task)
+
+ assert.Equal(t, tt.wantMatched, gotMatched, "Matched result")
+ assert.Equal(t, tt.wantScore, gotScore, "Score")
})
}
}
diff --git a/server/grpc/rpc.go b/server/grpc/rpc.go
index 83d366c77..9297f3502 100644
--- a/server/grpc/rpc.go
+++ b/server/grpc/rpc.go
@@ -39,6 +39,9 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/server/store"
)
+// updateAgentLastWorkDelay the delay before the LastWork info should be updated.
+const updateAgentLastWorkDelay = time.Minute
+
type RPC struct {
queue queue.Queue
pubsub *pubsub.Publisher
@@ -54,8 +57,6 @@ func (s *RPC) Next(c context.Context, agentFilter rpc.Filter) (*rpc.Workflow, er
log.Debug().Msgf("agent connected: %s: polling", hostname)
}
- filterFn := createFilterFunc(agentFilter)
-
agent, err := s.getAgentFromContext(c)
if err != nil {
return nil, err
@@ -66,6 +67,20 @@ func (s *RPC) Next(c context.Context, agentFilter rpc.Filter) (*rpc.Workflow, er
return nil, nil
}
+ agentServerLabels, err := agent.GetServerLabels()
+ if err != nil {
+ return nil, err
+ }
+
+ // enforce labels from server by overwriting agent labels
+ for k, v := range agentServerLabels {
+ agentFilter.Labels[k] = v
+ }
+
+ log.Trace().Msgf("Agent %s[%d] tries to pull task with labels: %v", agent.Name, agent.ID, agentFilter.Labels)
+
+ filterFn := createFilterFunc(agentFilter)
+
for {
// poll blocks until a task is available or the context is canceled / worker is kicked
task, err := s.queue.Poll(c, agent.ID, filterFn)
@@ -88,6 +103,15 @@ func (s *RPC) Next(c context.Context, agentFilter rpc.Filter) (*rpc.Workflow, er
// Wait blocks until the workflow with the given ID is done.
func (s *RPC) Wait(c context.Context, workflowID string) error {
+ agent, err := s.getAgentFromContext(c)
+ if err != nil {
+ return err
+ }
+
+ if err := s.checkAgentPermissionByWorkflow(c, agent, workflowID, nil, nil); err != nil {
+ return err
+ }
+
return s.queue.Wait(c, workflowID)
}
@@ -98,17 +122,20 @@ func (s *RPC) Extend(c context.Context, workflowID string) error {
return err
}
- agent.LastWork = time.Now().Unix()
- err = s.store.AgentUpdate(agent)
+ err = s.updateAgentLastWork(agent)
if err != nil {
return err
}
- return s.queue.Extend(c, workflowID)
+ if err := s.checkAgentPermissionByWorkflow(c, agent, workflowID, nil, nil); err != nil {
+ return err
+ }
+
+ return s.queue.Extend(c, agent.ID, workflowID)
}
// Update updates the state of a step.
-func (s *RPC) Update(_ context.Context, strWorkflowID string, state rpc.StepState) error {
+func (s *RPC) Update(c context.Context, strWorkflowID string, state rpc.StepState) error {
workflowID, err := strconv.ParseInt(strWorkflowID, 10, 64)
if err != nil {
return err
@@ -126,6 +153,11 @@ func (s *RPC) Update(_ context.Context, strWorkflowID string, state rpc.StepStat
return err
}
+ agent, err := s.getAgentFromContext(c)
+ if err != nil {
+ return err
+ }
+
step, err := s.store.StepByUUID(state.StepUUID)
if err != nil {
log.Error().Err(err).Msgf("cannot find step with uuid %s", state.StepUUID)
@@ -138,7 +170,7 @@ func (s *RPC) Update(_ context.Context, strWorkflowID string, state rpc.StepStat
Int64("stepPipelineID", step.PipelineID).
Int64("currentPipelineID", currentPipeline.ID).
Msg(msg)
- return fmt.Errorf(msg)
+ return errors.New(msg)
}
repo, err := s.store.GetRepo(currentPipeline.RepoID)
@@ -147,6 +179,11 @@ func (s *RPC) Update(_ context.Context, strWorkflowID string, state rpc.StepStat
return err
}
+ // check before agent can alter some state
+ if err := s.checkAgentPermissionByWorkflow(c, agent, strWorkflowID, currentPipeline, repo); err != nil {
+ return err
+ }
+
if err := pipeline.UpdateStepStatus(s.store, step, state); err != nil {
log.Error().Err(err).Msg("rpc.update: cannot update step")
}
@@ -190,6 +227,7 @@ func (s *RPC) Init(c context.Context, strWorkflowID string, state rpc.WorkflowSt
if err != nil {
return err
}
+
workflow.AgentID = agent.ID
currentPipeline, err := s.store.GetPipeline(workflow.PipelineID)
@@ -204,6 +242,11 @@ func (s *RPC) Init(c context.Context, strWorkflowID string, state rpc.WorkflowSt
return err
}
+ // check before agent can alter some state
+ if err := s.checkAgentPermissionByWorkflow(c, agent, strWorkflowID, currentPipeline, repo); err != nil {
+ return err
+ }
+
if currentPipeline.Status == model.StatusPending {
if currentPipeline, err = pipeline.UpdateToStatusRunning(s.store, *currentPipeline, state.Started); err != nil {
log.Error().Err(err).Msgf("init: cannot update pipeline %d state", currentPipeline.ID)
@@ -237,8 +280,7 @@ func (s *RPC) Init(c context.Context, strWorkflowID string, state rpc.WorkflowSt
}
s.updateForgeStatus(c, repo, currentPipeline, workflow)
- agent.LastWork = time.Now().Unix()
- return s.store.AgentUpdate(agent)
+ return s.updateAgentLastWork(agent)
}
// Done marks the workflow with the given ID as done.
@@ -271,6 +313,16 @@ func (s *RPC) Done(c context.Context, strWorkflowID string, state rpc.WorkflowSt
return err
}
+ agent, err := s.getAgentFromContext(c)
+ if err != nil {
+ return err
+ }
+
+ // check before agent can alter some state
+ if err := s.checkAgentPermissionByWorkflow(c, agent, strWorkflowID, currentPipeline, repo); err != nil {
+ return err
+ }
+
logger := log.With().
Str("repo_id", fmt.Sprint(repo.ID)).
Str("pipeline_id", fmt.Sprint(currentPipeline.ID)).
@@ -327,50 +379,69 @@ func (s *RPC) Done(c context.Context, strWorkflowID string, state rpc.WorkflowSt
s.pipelineTime.WithLabelValues(repo.FullName, currentPipeline.Branch, string(workflow.State), workflow.Name).Set(float64(workflow.Finished - workflow.Started))
}
+ return s.updateAgentLastWork(agent)
+}
+
+// Log writes a log entry to the database and publishes it to the pubsub.
+// An explicit stepUUID makes it obvious that all entries must come from the same step.
+func (s *RPC) Log(c context.Context, stepUUID string, rpcLogEntries []*rpc.LogEntry) error {
+ step, err := s.store.StepByUUID(stepUUID)
+ if err != nil {
+ return fmt.Errorf("could not find step with uuid %s in store: %w", stepUUID, err)
+ }
+
agent, err := s.getAgentFromContext(c)
if err != nil {
return err
}
- agent.LastWork = time.Now().Unix()
- return s.store.AgentUpdate(agent)
-}
-// Log writes a log entry to the database and publishes it to the pubsub.
-func (s *RPC) Log(c context.Context, rpcLogEntry *rpc.LogEntry) error {
- // convert rpc log_entry to model.log_entry
- step, err := s.store.StepByUUID(rpcLogEntry.StepUUID)
+ currentPipeline, err := s.store.GetPipeline(step.PipelineID)
if err != nil {
- return fmt.Errorf("could not find step with uuid %s in store: %w", rpcLogEntry.StepUUID, err)
+ log.Error().Err(err).Msgf("cannot find pipeline with id %d", step.PipelineID)
+ return err
}
- logEntry := &model.LogEntry{
- StepID: step.ID,
- Time: rpcLogEntry.Time,
- Line: rpcLogEntry.Line,
- Data: rpcLogEntry.Data,
- Type: model.LogEntryType(rpcLogEntry.Type),
+
+ // check before agent can alter some state
+ if err := s.checkAgentPermissionByWorkflow(c, agent, "", currentPipeline, nil); err != nil {
+ return err
+ }
+
+ err = s.updateAgentLastWork(agent)
+ if err != nil {
+ return err
+ }
+
+ var logEntries []*model.LogEntry
+
+ for _, rpcLogEntry := range rpcLogEntries {
+ if rpcLogEntry.StepUUID != stepUUID {
+ return fmt.Errorf("expected step UUID %s, got %s", stepUUID, rpcLogEntry.StepUUID)
+ }
+ logEntries = append(logEntries, &model.LogEntry{
+ StepID: step.ID,
+ Time: rpcLogEntry.Time,
+ Line: rpcLogEntry.Line,
+ Data: rpcLogEntry.Data,
+ Type: model.LogEntryType(rpcLogEntry.Type),
+ })
}
// make sure writes to pubsub are non blocking (https://github.com/woodpecker-ci/woodpecker/blob/c919f32e0b6432a95e1a6d3d0ad662f591adf73f/server/logging/log.go#L9)
go func() {
// write line to listening web clients
- if err := s.logger.Write(c, logEntry.StepID, logEntry); err != nil {
+ if err := s.logger.Write(c, step.ID, logEntries); err != nil {
log.Error().Err(err).Msgf("rpc server could not write to logger")
}
}()
- agent, err := s.getAgentFromContext(c)
- if err != nil {
- return err
- }
- agent.LastWork = time.Now().Unix()
- if err := s.store.AgentUpdate(agent); err != nil {
- return err
+ if err = server.Config.Services.LogStore.LogAppend(step, logEntries); err != nil {
+ log.Error().Err(err).Msg("could not store log entries")
}
- return server.Config.Services.LogStore.LogAppend(logEntry)
+ return nil
}
-func (s *RPC) RegisterAgent(ctx context.Context, platform, backend, version string, capacity int32) (int64, error) {
+func (s *RPC) RegisterAgent(ctx context.Context, info rpc.AgentInfo) (int64, error) {
agent, err := s.getAgentFromContext(ctx)
if err != nil {
return -1, err
@@ -382,10 +453,11 @@ func (s *RPC) RegisterAgent(ctx context.Context, platform, backend, version stri
}
}
- agent.Backend = backend
- agent.Platform = platform
- agent.Capacity = capacity
- agent.Version = version
+ agent.Backend = info.Backend
+ agent.Platform = info.Platform
+ agent.Capacity = int32(info.Capacity)
+ agent.Version = info.Version
+ agent.CustomLabels = info.CustomLabels
err = s.store.AgentUpdate(agent)
if err != nil {
@@ -428,6 +500,44 @@ func (s *RPC) ReportHealth(ctx context.Context, status string) error {
return s.store.AgentUpdate(agent)
}
+func (s *RPC) checkAgentPermissionByWorkflow(_ context.Context, agent *model.Agent, strWorkflowID string, pipeline *model.Pipeline, repo *model.Repo) error {
+ var err error
+ if repo == nil && pipeline == nil {
+ workflowID, err := strconv.ParseInt(strWorkflowID, 10, 64)
+ if err != nil {
+ return err
+ }
+
+ workflow, err := s.store.WorkflowLoad(workflowID)
+ if err != nil {
+ log.Error().Err(err).Msgf("cannot find workflow with id %d", workflowID)
+ return err
+ }
+
+ pipeline, err = s.store.GetPipeline(workflow.PipelineID)
+ if err != nil {
+ log.Error().Err(err).Msgf("cannot find pipeline with id %d", workflow.PipelineID)
+ return err
+ }
+ }
+
+ if repo == nil {
+ repo, err = s.store.GetRepo(pipeline.RepoID)
+ if err != nil {
+ log.Error().Err(err).Msgf("cannot find repo with id %d", pipeline.RepoID)
+ return err
+ }
+ }
+
+ if agent.CanAccessRepo(repo) {
+ return nil
+ }
+
+ msg := fmt.Sprintf("agent '%d' is not allowed to interact with repo[%d] '%s'", agent.ID, repo.ID, repo.FullName)
+ log.Error().Int64("repoId", repo.ID).Msg(msg)
+ return errors.New(msg)
+}
+
func (s *RPC) completeChildrenIfParentCompleted(completedWorkflow *model.Workflow) {
for _, c := range completedWorkflow.Children {
if c.Running() {
@@ -510,3 +620,17 @@ func (s *RPC) getHostnameFromContext(ctx context.Context) (string, error) {
}
return "", errors.New("no hostname in metadata")
}
+
+func (s *RPC) updateAgentLastWork(agent *model.Agent) error {
+ // only update agent.LastWork if not recently updated
+ if time.Unix(agent.LastWork, 0).Add(updateAgentLastWorkDelay).After(time.Now()) {
+ return nil
+ }
+
+ agent.LastWork = time.Now().Unix()
+ if err := s.store.AgentUpdate(agent); err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/server/grpc/rpc_test.go b/server/grpc/rpc_test.go
index 1fd850b8a..60bd8193a 100644
--- a/server/grpc/rpc_test.go
+++ b/server/grpc/rpc_test.go
@@ -17,11 +17,14 @@ package grpc
import (
"context"
"testing"
+ "time"
"github.com/franela/goblin"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/mock"
"google.golang.org/grpc/metadata"
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
mocks_store "go.woodpecker-ci.org/woodpecker/v2/server/store/mocks"
)
@@ -50,15 +53,19 @@ func TestRegisterAgent(t *testing.T) {
store.On("AgentFind", int64(1337)).Once().Return(storeAgent, nil)
store.On("AgentUpdate", &updatedAgent).Once().Return(nil)
- rpc := RPC{
+ grpc := RPC{
store: store,
}
ctx := metadata.NewIncomingContext(
context.Background(),
metadata.Pairs("hostname", "hostname", "agent_id", "1337"),
)
- capacity := int32(2)
- agentID, err := rpc.RegisterAgent(ctx, "platform", "backend", "version", capacity)
+ agentID, err := grpc.RegisterAgent(ctx, rpc.AgentInfo{
+ Version: "version",
+ Platform: "platform",
+ Backend: "backend",
+ Capacity: 2,
+ })
if !assert.NoError(t, err) {
return
}
@@ -90,15 +97,19 @@ func TestRegisterAgent(t *testing.T) {
store.On("AgentFind", int64(1337)).Once().Return(storeAgent, nil)
store.On("AgentUpdate", &updatedAgent).Once().Return(nil)
- rpc := RPC{
+ grpc := RPC{
store: store,
}
ctx := metadata.NewIncomingContext(
context.Background(),
metadata.Pairs("hostname", "newHostname", "agent_id", "1337"),
)
- capacity := int32(2)
- agentID, err := rpc.RegisterAgent(ctx, "platform", "backend", "version", capacity)
+ agentID, err := grpc.RegisterAgent(ctx, rpc.AgentInfo{
+ Version: "version",
+ Platform: "platform",
+ Backend: "backend",
+ Capacity: 2,
+ })
if !assert.NoError(t, err) {
return
}
@@ -107,3 +118,51 @@ func TestRegisterAgent(t *testing.T) {
})
})
}
+
+func TestUpdateAgentLastWork(t *testing.T) {
+ t.Run("When last work was never updated it should update last work timestamp", func(t *testing.T) {
+ agent := model.Agent{
+ LastWork: 0,
+ }
+ store := mocks_store.NewStore(t)
+ rpc := RPC{
+ store: store,
+ }
+ store.On("AgentUpdate", mock.Anything).Once().Return(nil)
+
+ err := rpc.updateAgentLastWork(&agent)
+ assert.NoError(t, err)
+
+ assert.NotZero(t, agent.LastWork)
+ })
+
+ t.Run("When last work was updated over a minute ago it should update last work timestamp", func(t *testing.T) {
+ lastWork := time.Now().Add(-time.Hour).Unix()
+ agent := model.Agent{
+ LastWork: lastWork,
+ }
+ store := mocks_store.NewStore(t)
+ rpc := RPC{
+ store: store,
+ }
+ store.On("AgentUpdate", mock.Anything).Once().Return(nil)
+
+ err := rpc.updateAgentLastWork(&agent)
+ assert.NoError(t, err)
+
+ assert.NotEqual(t, lastWork, agent.LastWork)
+ })
+
+ t.Run("When last work was updated in the last minute it should not update last work timestamp again", func(t *testing.T) {
+ lastWork := time.Now().Add(-time.Second * 30).Unix()
+ agent := model.Agent{
+ LastWork: lastWork,
+ }
+ rpc := RPC{}
+
+ err := rpc.updateAgentLastWork(&agent)
+ assert.NoError(t, err)
+
+ assert.Equal(t, lastWork, agent.LastWork)
+ })
+}
diff --git a/server/grpc/server.go b/server/grpc/server.go
index d6882c0f8..2cfa8548a 100644
--- a/server/grpc/server.go
+++ b/server/grpc/server.go
@@ -20,6 +20,7 @@ import (
"github.com/prometheus/client_golang/prometheus"
prometheus_auto "github.com/prometheus/client_golang/prometheus/promauto"
+ "github.com/rs/zerolog/log"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc/proto"
@@ -133,21 +134,52 @@ func (s *WoodpeckerServer) Extend(c context.Context, req *proto.ExtendRequest) (
}
func (s *WoodpeckerServer) Log(c context.Context, req *proto.LogRequest) (*proto.Empty, error) {
- logEntry := &rpc.LogEntry{
- Data: req.GetLogEntry().GetData(),
- Line: int(req.GetLogEntry().GetLine()),
- Time: req.GetLogEntry().GetTime(),
- StepUUID: req.GetLogEntry().GetStepUuid(),
- Type: int(req.GetLogEntry().GetType()),
+ var (
+ entries []*rpc.LogEntry
+ stepUUID string
+ )
+
+ write := func() error {
+ if len(entries) > 0 {
+ if err := s.peer.Log(c, stepUUID, entries); err != nil {
+ log.Error().Err(err).Msg("could not write log entries")
+ return err
+ }
+ }
+ return nil
}
+
+ for _, reqEntry := range req.GetLogEntries() {
+ entry := &rpc.LogEntry{
+ Data: reqEntry.GetData(),
+ Line: int(reqEntry.GetLine()),
+ Time: reqEntry.GetTime(),
+ StepUUID: reqEntry.GetStepUuid(),
+ Type: int(reqEntry.GetType()),
+ }
+ if entry.StepUUID != stepUUID {
+ _ = write()
+ stepUUID = entry.StepUUID
+ entries = entries[:0]
+ }
+ entries = append(entries, entry)
+ }
+
res := new(proto.Empty)
- err := s.peer.Log(c, logEntry)
+ err := write()
return res, err
}
func (s *WoodpeckerServer) RegisterAgent(c context.Context, req *proto.RegisterAgentRequest) (*proto.RegisterAgentResponse, error) {
res := new(proto.RegisterAgentResponse)
- agentID, err := s.peer.RegisterAgent(c, req.GetPlatform(), req.GetBackend(), req.GetVersion(), req.GetCapacity())
+ agentInfo := req.GetInfo()
+ agentID, err := s.peer.RegisterAgent(c, rpc.AgentInfo{
+ Version: agentInfo.GetVersion(),
+ Platform: agentInfo.GetPlatform(),
+ Backend: agentInfo.GetBackend(),
+ Capacity: int(agentInfo.GetCapacity()),
+ CustomLabels: agentInfo.GetCustomLabels(),
+ })
res.AgentId = agentID
return res, err
}
diff --git a/server/logging/log.go b/server/logging/log.go
index 1db5475e5..0e713644f 100644
--- a/server/logging/log.go
+++ b/server/logging/log.go
@@ -18,6 +18,8 @@ import (
"context"
"sync"
+ logger "github.com/rs/zerolog/log"
+
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
@@ -38,7 +40,7 @@ import (
// sub.start()... event loop
type subscriber struct {
- handler Handler
+ receiver LogChan
}
type stream struct {
@@ -77,7 +79,7 @@ func (l *log) Open(_ context.Context, stepID int64) error {
return nil
}
-func (l *log) Write(ctx context.Context, stepID int64, logEntry *model.LogEntry) error {
+func (l *log) Write(ctx context.Context, stepID int64, entries []*model.LogEntry) error {
l.Lock()
s, ok := l.streams[stepID]
l.Unlock()
@@ -92,15 +94,20 @@ func (l *log) Write(ctx context.Context, stepID int64, logEntry *model.LogEntry)
}
s.Lock()
- s.list = append(s.list, logEntry)
+ s.list = append(s.list, entries...)
for sub := range s.subs {
- go sub.handler(logEntry)
+ select {
+ case sub.receiver <- entries:
+ default:
+ logger.Info().Msgf("subscriber channel is full -- dropping logs for step %d", stepID)
+ }
}
s.Unlock()
+
return nil
}
-func (l *log) Tail(c context.Context, stepID int64, handler Handler) error {
+func (l *log) Tail(c context.Context, stepID int64, receiver LogChan) error {
l.Lock()
s, ok := l.streams[stepID]
l.Unlock()
@@ -109,11 +116,11 @@ func (l *log) Tail(c context.Context, stepID int64, handler Handler) error {
}
sub := &subscriber{
- handler: handler,
+ receiver: receiver,
}
s.Lock()
if len(s.list) != 0 {
- sub.handler(s.list...)
+ sub.receiver <- s.list
}
s.subs[sub] = struct{}{}
s.Unlock()
diff --git a/server/logging/log_test.go b/server/logging/log_test.go
index 90565a48f..f84a5b8f3 100644
--- a/server/logging/log_test.go
+++ b/server/logging/log_test.go
@@ -39,28 +39,37 @@ func TestLogging(t *testing.T) {
context.Background(),
)
+ receiver := make(LogChan, 10)
+ defer close(receiver)
+
+ go func() {
+ for range receiver {
+ wg.Done()
+ }
+ }()
+
logger := New()
assert.NoError(t, logger.Open(ctx, testStepID))
go func() {
- assert.NoError(t, logger.Tail(ctx, testStepID, func(_ ...*model.LogEntry) { wg.Done() }))
+ assert.NoError(t, logger.Tail(ctx, testStepID, receiver))
}()
go func() {
- assert.NoError(t, logger.Tail(ctx, testStepID, func(_ ...*model.LogEntry) { wg.Done() }))
+ assert.NoError(t, logger.Tail(ctx, testStepID, receiver))
}()
<-time.After(500 * time.Millisecond)
wg.Add(4)
go func() {
- assert.NoError(t, logger.Write(ctx, testStepID, testEntry))
- assert.NoError(t, logger.Write(ctx, testStepID, testEntry))
+ assert.NoError(t, logger.Write(ctx, testStepID, []*model.LogEntry{testEntry}))
+ assert.NoError(t, logger.Write(ctx, testStepID, []*model.LogEntry{testEntry}))
}()
wg.Wait()
wg.Add(1)
go func() {
- assert.NoError(t, logger.Tail(ctx, testStepID, func(_ ...*model.LogEntry) { wg.Done() }))
+ assert.NoError(t, logger.Tail(ctx, testStepID, receiver))
}()
<-time.After(500 * time.Millisecond)
diff --git a/server/logging/logging.go b/server/logging/logging.go
index 400273def..e8eb80117 100644
--- a/server/logging/logging.go
+++ b/server/logging/logging.go
@@ -24,8 +24,8 @@ import (
// ErrNotFound is returned when the log does not exist.
var ErrNotFound = errors.New("stream: not found")
-// Handler defines a callback function for handling log entries.
-type Handler func(...*model.LogEntry)
+// LogChan defines a channel type for receiving ordered batches of log entries.
+type LogChan chan []*model.LogEntry
// Log defines a log multiplexer.
type Log interface {
@@ -33,10 +33,10 @@ type Log interface {
Open(c context.Context, stepID int64) error
// Write writes the entry to the log.
- Write(c context.Context, stepID int64, entry *model.LogEntry) error
+ Write(c context.Context, stepID int64, entries []*model.LogEntry) error
// Tail tails the log.
- Tail(c context.Context, stepID int64, handler Handler) error
+ Tail(c context.Context, stepID int64, handler LogChan) error
// Close closes the log.
Close(c context.Context, stepID int64) error
diff --git a/server/model/agent.go b/server/model/agent.go
index 31655cbb8..b57c56baa 100644
--- a/server/model/agent.go
+++ b/server/model/agent.go
@@ -14,27 +14,73 @@
package model
+import (
+ "encoding/base32"
+ "fmt"
+
+ "github.com/gorilla/securecookie"
+)
+
type Agent struct {
- ID int64 `json:"id" xorm:"pk autoincr 'id'"`
- Created int64 `json:"created" xorm:"created"`
- Updated int64 `json:"updated" xorm:"updated"`
- Name string `json:"name" xorm:"name"`
- OwnerID int64 `json:"owner_id" xorm:"'owner_id'"`
- Token string `json:"token" xorm:"token"`
- LastContact int64 `json:"last_contact" xorm:"last_contact"`
- LastWork int64 `json:"last_work" xorm:"last_work"` // last time the agent did something, this value is used to determine if the agent is still doing work used by the autoscaler
- Platform string `json:"platform" xorm:"VARCHAR(100) 'platform'"`
- Backend string `json:"backend" xorm:"VARCHAR(100) 'backend'"`
- Capacity int32 `json:"capacity" xorm:"capacity"`
- Version string `json:"version" xorm:"'version'"`
- NoSchedule bool `json:"no_schedule" xorm:"no_schedule"`
+ ID int64 `json:"id" xorm:"pk autoincr 'id'"`
+ Created int64 `json:"created" xorm:"created"`
+ Updated int64 `json:"updated" xorm:"updated"`
+ Name string `json:"name" xorm:"name"`
+ OwnerID int64 `json:"owner_id" xorm:"'owner_id'"`
+ Token string `json:"token" xorm:"token"`
+ LastContact int64 `json:"last_contact" xorm:"last_contact"`
+ LastWork int64 `json:"last_work" xorm:"last_work"` // last time the agent did something, this value is used to determine if the agent is still doing work used by the autoscaler
+ Platform string `json:"platform" xorm:"VARCHAR(100) 'platform'"`
+ Backend string `json:"backend" xorm:"VARCHAR(100) 'backend'"`
+ Capacity int32 `json:"capacity" xorm:"capacity"`
+ Version string `json:"version" xorm:"'version'"`
+ NoSchedule bool `json:"no_schedule" xorm:"no_schedule"`
+ CustomLabels map[string]string `json:"custom_labels" xorm:"JSON 'custom_labels'"`
+ // OrgID is counted as unset if set to -1, this is done to ensure a new(Agent) still enforce the OrgID check by default
+ OrgID int64 `json:"org_id" xorm:"INDEX 'org_id'"`
} // @name Agent
+const (
+ IDNotSet = -1
+ agentFilterOrgID = "org-id"
+)
+
// TableName return database table name for xorm.
func (Agent) TableName() string {
return "agents"
}
func (a *Agent) IsSystemAgent() bool {
- return a.OwnerID == -1
+ return a.OwnerID == IDNotSet
+}
+
+func GenerateNewAgentToken() string {
+ return base32.StdEncoding.EncodeToString(securecookie.GenerateRandomKey(32))
+}
+
+func (a *Agent) GetServerLabels() (map[string]string, error) {
+ filters := make(map[string]string)
+
+ // enforce filters for user and organization agents
+ if a.OrgID != IDNotSet {
+ filters[agentFilterOrgID] = fmt.Sprintf("%d", a.OrgID)
+ } else {
+ filters[agentFilterOrgID] = "*"
+ }
+
+ return filters, nil
+}
+
+func (a *Agent) CanAccessRepo(repo *Repo) bool {
+ // global agent
+ if a.OrgID == IDNotSet {
+ return true
+ }
+
+ // agent has access to the organization
+ if a.OrgID == repo.OrgID {
+ return true
+ }
+
+ return false
}
diff --git a/server/model/agent_test.go b/server/model/agent_test.go
new file mode 100644
index 000000000..90356c456
--- /dev/null
+++ b/server/model/agent_test.go
@@ -0,0 +1,90 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package model
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestGenerateNewAgentToken(t *testing.T) {
+ token1 := GenerateNewAgentToken()
+ token2 := GenerateNewAgentToken()
+
+ assert.NotEmpty(t, token1)
+ assert.NotEmpty(t, token2)
+ assert.NotEqual(t, token1, token2)
+ assert.Len(t, token1, 56)
+}
+
+func TestAgent_GetServerLabels(t *testing.T) {
+ t.Run("EmptyAgent", func(t *testing.T) {
+ agent := &Agent{}
+ filters, err := agent.GetServerLabels()
+ assert.NoError(t, err)
+ assert.Equal(t, map[string]string{
+ agentFilterOrgID: "0",
+ }, filters)
+ })
+
+ t.Run("GlobalAgent", func(t *testing.T) {
+ agent := &Agent{
+ OrgID: IDNotSet,
+ }
+ filters, err := agent.GetServerLabels()
+ assert.NoError(t, err)
+ assert.Equal(t, map[string]string{
+ agentFilterOrgID: "*",
+ }, filters)
+ })
+
+ t.Run("OrgAgent", func(t *testing.T) {
+ agent := &Agent{
+ OrgID: 123,
+ }
+ filters, err := agent.GetServerLabels()
+ assert.NoError(t, err)
+ assert.Equal(t, map[string]string{
+ agentFilterOrgID: "123",
+ }, filters)
+ })
+}
+
+func TestAgent_CanAccessRepo(t *testing.T) {
+ repo := &Repo{ID: 123, OrgID: 12}
+ otherRepo := &Repo{ID: 456, OrgID: 45}
+
+ t.Run("EmptyAgent", func(t *testing.T) {
+ agent := &Agent{}
+ assert.False(t, agent.CanAccessRepo(repo))
+ })
+
+ t.Run("GlobalAgent", func(t *testing.T) {
+ agent := &Agent{
+ OrgID: IDNotSet,
+ }
+
+ assert.True(t, agent.CanAccessRepo(repo))
+ })
+
+ t.Run("OrgAgent", func(t *testing.T) {
+ agent := &Agent{
+ OrgID: 12,
+ }
+ assert.True(t, agent.CanAccessRepo(repo))
+ assert.False(t, agent.CanAccessRepo(otherRepo))
+ })
+}
diff --git a/server/model/cron.go b/server/model/cron.go
index 42467de35..cdce73ef3 100644
--- a/server/model/cron.go
+++ b/server/model/cron.go
@@ -17,18 +17,18 @@ package model
import (
"fmt"
- "github.com/robfig/cron"
+ "github.com/gdgvda/cron"
)
type Cron struct {
- ID int64 `json:"id" xorm:"pk autoincr 'id'"`
- Name string `json:"name" xorm:"name UNIQUE(s) INDEX"`
- RepoID int64 `json:"repo_id" xorm:"repo_id UNIQUE(s) INDEX"`
- CreatorID int64 `json:"creator_id" xorm:"creator_id INDEX"`
- NextExec int64 `json:"next_exec" xorm:"next_exec"`
- Schedule string `json:"schedule" xorm:"schedule NOT NULL"` // @weekly, 3min, ...
- Created int64 `json:"created_at" xorm:"created NOT NULL DEFAULT 0"` // TODO change JSON field to "created" in 3.0
- Branch string `json:"branch" xorm:"branch"`
+ ID int64 `json:"id" xorm:"pk autoincr 'id'"`
+ Name string `json:"name" xorm:"name UNIQUE(s) INDEX"`
+ RepoID int64 `json:"repo_id" xorm:"repo_id UNIQUE(s) INDEX"`
+ CreatorID int64 `json:"creator_id" xorm:"creator_id INDEX"`
+ NextExec int64 `json:"next_exec" xorm:"next_exec"`
+ Schedule string `json:"schedule" xorm:"schedule NOT NULL"` // @weekly, 3min, ...
+ Created int64 `json:"created" xorm:"created NOT NULL DEFAULT 0"`
+ Branch string `json:"branch" xorm:"branch"`
} // @name Cron
// TableName returns the database table name for xorm.
@@ -46,7 +46,7 @@ func (c *Cron) Validate() error {
return fmt.Errorf("schedule is required")
}
- _, err := cron.Parse(c.Schedule)
+ _, err := cron.ParseStandard(c.Schedule)
if err != nil {
return fmt.Errorf("can't parse schedule: %w", err)
}
diff --git a/server/model/feed.go b/server/model/feed.go
index 0dd4b5d3a..04357fc4e 100644
--- a/server/model/feed.go
+++ b/server/model/feed.go
@@ -22,9 +22,9 @@ type Feed struct {
Number int64 `json:"number,omitempty" xorm:"pipeline_number"`
Event string `json:"event,omitempty" xorm:"pipeline_event"`
Status string `json:"status,omitempty" xorm:"pipeline_status"`
- Created int64 `json:"created_at,omitempty" xorm:"pipeline_created"` // TODO change JSON field to "created" in 3.0
- Started int64 `json:"started_at,omitempty" xorm:"pipeline_started"` // TODO change JSON field to "started" in 3.0
- Finished int64 `json:"finished_at,omitempty" xorm:"pipeline_finished"` // TODO change JSON field to "finished" in 3.0
+ Created int64 `json:"created,omitempty" xorm:"pipeline_created"`
+ Started int64 `json:"started,omitempty" xorm:"pipeline_started"`
+ Finished int64 `json:"finished,omitempty" xorm:"pipeline_finished"`
Commit string `json:"commit,omitempty" xorm:"pipeline_commit"`
Branch string `json:"branch,omitempty" xorm:"pipeline_branch"`
Ref string `json:"ref,omitempty" xorm:"pipeline_ref"`
diff --git a/server/model/pipeline.go b/server/model/pipeline.go
index 5106308de..a073ad15f 100644
--- a/server/model/pipeline.go
+++ b/server/model/pipeline.go
@@ -28,10 +28,10 @@ type Pipeline struct {
Event WebhookEvent `json:"event" xorm:"event"`
Status StatusValue `json:"status" xorm:"INDEX 'status'"`
Errors []*types.PipelineError `json:"errors" xorm:"json 'errors'"`
- Created int64 `json:"created_at" xorm:"'created' NOT NULL DEFAULT 0 created"` // TODO change JSON field to "created" in 3.0
- Updated int64 `json:"updated_at" xorm:"'updated' NOT NULL DEFAULT 0 updated"` // TODO change JSON field to "updated" in 3.0
- Started int64 `json:"started_at" xorm:"started"` // TODO change JSON field to "started" in 3.0
- Finished int64 `json:"finished_at" xorm:"finished"` // TODO change JSON field to "finished" in 3.0
+ Created int64 `json:"created" xorm:"'created' NOT NULL DEFAULT 0 created"`
+ Updated int64 `json:"updated" xorm:"'updated' NOT NULL DEFAULT 0 updated"`
+ Started int64 `json:"started" xorm:"started"`
+ Finished int64 `json:"finished" xorm:"finished"`
DeployTo string `json:"deploy_to" xorm:"deploy"`
DeployTask string `json:"deploy_task" xorm:"deploy_task"`
Commit string `json:"commit" xorm:"commit"`
@@ -46,7 +46,7 @@ type Pipeline struct {
Email string `json:"author_email" xorm:"email"`
ForgeURL string `json:"forge_url" xorm:"forge_url"`
Reviewer string `json:"reviewed_by" xorm:"reviewer"`
- Reviewed int64 `json:"reviewed_at" xorm:"reviewed"` // TODO change JSON field to "reviewed" in 3.0
+ Reviewed int64 `json:"reviewed" xorm:"reviewed"`
Workflows []*Workflow `json:"workflows,omitempty" xorm:"-"`
ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"`
AdditionalVariables map[string]string `json:"variables,omitempty" xorm:"json 'additional_variables'"`
diff --git a/server/model/repo.go b/server/model/repo.go
index 8cbdb86db..3c18e17e0 100644
--- a/server/model/repo.go
+++ b/server/model/repo.go
@@ -23,34 +23,34 @@ import (
// Repo represents a repository.
type Repo struct {
ID int64 `json:"id,omitempty" xorm:"pk autoincr 'id'"`
- UserID int64 `json:"-" xorm:"user_id"`
+ UserID int64 `json:"-" xorm:"INDEX 'user_id'"`
ForgeID int64 `json:"forge_id,omitempty" xorm:"forge_id"`
// ForgeRemoteID is the unique identifier for the repository on the forge.
- ForgeRemoteID ForgeRemoteID `json:"forge_remote_id" xorm:"forge_remote_id"`
- OrgID int64 `json:"org_id" xorm:"org_id"`
- Owner string `json:"owner" xorm:"UNIQUE(name) 'owner'"`
- Name string `json:"name" xorm:"UNIQUE(name) 'name'"`
- FullName string `json:"full_name" xorm:"UNIQUE 'full_name'"`
- Avatar string `json:"avatar_url,omitempty" xorm:"varchar(500) 'avatar'"`
- ForgeURL string `json:"forge_url,omitempty" xorm:"varchar(1000) 'forge_url'"`
- Clone string `json:"clone_url,omitempty" xorm:"varchar(1000) 'clone'"`
- CloneSSH string `json:"clone_url_ssh" xorm:"varchar(1000) 'clone_ssh'"`
- Branch string `json:"default_branch,omitempty" xorm:"varchar(500) 'branch'"`
- SCMKind SCMKind `json:"scm,omitempty" xorm:"varchar(50) 'scm'"`
- PREnabled bool `json:"pr_enabled" xorm:"DEFAULT TRUE 'pr_enabled'"`
- Timeout int64 `json:"timeout,omitempty" xorm:"timeout"`
- Visibility RepoVisibility `json:"visibility" xorm:"varchar(10) 'visibility'"`
- IsSCMPrivate bool `json:"private" xorm:"private"`
- IsTrusted bool `json:"trusted" xorm:"trusted"`
- IsGated bool `json:"gated" xorm:"gated"`
- IsActive bool `json:"active" xorm:"active"`
- AllowPull bool `json:"allow_pr" xorm:"allow_pr"`
- AllowDeploy bool `json:"allow_deploy" xorm:"allow_deploy"`
- Config string `json:"config_file" xorm:"varchar(500) 'config_path'"`
- Hash string `json:"-" xorm:"varchar(500) 'hash'"`
- Perm *Perm `json:"-" xorm:"-"`
- CancelPreviousPipelineEvents []WebhookEvent `json:"cancel_previous_pipeline_events" xorm:"json 'cancel_previous_pipeline_events'"`
- NetrcOnlyTrusted bool `json:"netrc_only_trusted" xorm:"NOT NULL DEFAULT true 'netrc_only_trusted'"`
+ ForgeRemoteID ForgeRemoteID `json:"forge_remote_id" xorm:"forge_remote_id"`
+ OrgID int64 `json:"org_id" xorm:"INDEX 'org_id'"`
+ Owner string `json:"owner" xorm:"UNIQUE(name) 'owner'"`
+ Name string `json:"name" xorm:"UNIQUE(name) 'name'"`
+ FullName string `json:"full_name" xorm:"UNIQUE 'full_name'"`
+ Avatar string `json:"avatar_url,omitempty" xorm:"varchar(500) 'avatar'"`
+ ForgeURL string `json:"forge_url,omitempty" xorm:"varchar(1000) 'forge_url'"`
+ Clone string `json:"clone_url,omitempty" xorm:"varchar(1000) 'clone'"`
+ CloneSSH string `json:"clone_url_ssh" xorm:"varchar(1000) 'clone_ssh'"`
+ Branch string `json:"default_branch,omitempty" xorm:"varchar(500) 'branch'"`
+ SCMKind SCMKind `json:"scm,omitempty" xorm:"varchar(50) 'scm'"`
+ PREnabled bool `json:"pr_enabled" xorm:"DEFAULT TRUE 'pr_enabled'"`
+ Timeout int64 `json:"timeout,omitempty" xorm:"timeout"`
+ Visibility RepoVisibility `json:"visibility" xorm:"varchar(10) 'visibility'"`
+ IsSCMPrivate bool `json:"private" xorm:"private"`
+ Trusted TrustedConfiguration `json:"trusted" xorm:"json 'trusted'"`
+ IsGated bool `json:"gated" xorm:"gated"`
+ IsActive bool `json:"active" xorm:"active"`
+ AllowPull bool `json:"allow_pr" xorm:"allow_pr"`
+ AllowDeploy bool `json:"allow_deploy" xorm:"allow_deploy"`
+ Config string `json:"config_file" xorm:"varchar(500) 'config_path'"`
+ Hash string `json:"-" xorm:"varchar(500) 'hash'"`
+ Perm *Perm `json:"-" xorm:"-"`
+ CancelPreviousPipelineEvents []WebhookEvent `json:"cancel_previous_pipeline_events" xorm:"json 'cancel_previous_pipeline_events'"`
+ NetrcOnlyTrusted bool `json:"netrc_only_trusted" xorm:"NOT NULL DEFAULT true 'netrc_only_trusted'"`
} // @name Repo
// TableName return database table name for xorm.
@@ -108,15 +108,15 @@ func (r *Repo) Update(from *Repo) {
// RepoPatch represents a repository patch object.
type RepoPatch struct {
- Config *string `json:"config_file,omitempty"`
- IsTrusted *bool `json:"trusted,omitempty"`
- IsGated *bool `json:"gated,omitempty"`
- Timeout *int64 `json:"timeout,omitempty"`
- Visibility *string `json:"visibility,omitempty"`
- AllowPull *bool `json:"allow_pr,omitempty"`
- AllowDeploy *bool `json:"allow_deploy,omitempty"`
- CancelPreviousPipelineEvents *[]WebhookEvent `json:"cancel_previous_pipeline_events"`
- NetrcOnlyTrusted *bool `json:"netrc_only_trusted"`
+ Config *string `json:"config_file,omitempty"`
+ IsGated *bool `json:"gated,omitempty"`
+ Timeout *int64 `json:"timeout,omitempty"`
+ Visibility *string `json:"visibility,omitempty"`
+ AllowPull *bool `json:"allow_pr,omitempty"`
+ AllowDeploy *bool `json:"allow_deploy,omitempty"`
+ CancelPreviousPipelineEvents *[]WebhookEvent `json:"cancel_previous_pipeline_events"`
+ NetrcOnlyTrusted *bool `json:"netrc_only_trusted"`
+ Trusted *TrustedConfigurationPatch `json:"trusted"`
} // @name RepoPatch
type ForgeRemoteID string
@@ -124,3 +124,15 @@ type ForgeRemoteID string
func (r ForgeRemoteID) IsValid() bool {
return r != "" && r != "0"
}
+
+type TrustedConfiguration struct {
+ Network bool `json:"network"`
+ Volumes bool `json:"volumes"`
+ Security bool `json:"security"`
+}
+
+type TrustedConfigurationPatch struct {
+ Network *bool `json:"network"`
+ Volumes *bool `json:"volumes"`
+ Security *bool `json:"security"`
+}
diff --git a/server/model/resource_limit.go b/server/model/resource_limit.go
deleted file mode 100644
index 90a302993..000000000
--- a/server/model/resource_limit.go
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 Drone.IO Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package model
-
-// ResourceLimit is the resource limit to set on pipeline steps.
-type ResourceLimit struct {
- MemSwapLimit int64
- MemLimit int64
- ShmSize int64
- CPUQuota int64
- CPUShares int64
- CPUSet string
-}
diff --git a/server/model/step.go b/server/model/step.go
index 97189e733..dba0d3bac 100644
--- a/server/model/step.go
+++ b/server/model/step.go
@@ -36,8 +36,8 @@ type Step struct {
Error string `json:"error,omitempty" xorm:"TEXT 'error'"`
Failure string `json:"-" xorm:"failure"`
ExitCode int `json:"exit_code" xorm:"exit_code"`
- Started int64 `json:"start_time,omitempty" xorm:"started"`
- Finished int64 `json:"end_time,omitempty" xorm:"stopped"`
+ Started int64 `json:"started,omitempty" xorm:"started"`
+ Finished int64 `json:"finished,omitempty" xorm:"finished"`
Type StepType `json:"type,omitempty" xorm:"type"`
} // @name Step
diff --git a/server/model/task.go b/server/model/task.go
index bd24ca665..58cf69c28 100644
--- a/server/model/task.go
+++ b/server/model/task.go
@@ -22,7 +22,7 @@ import (
// Task defines scheduled pipeline Task.
type Task struct {
ID string `json:"id" xorm:"PK UNIQUE 'id'"`
- Data []byte `json:"data" xorm:"LONGBLOB 'data'"`
+ Data []byte `json:"-" xorm:"LONGBLOB 'data'"`
Labels map[string]string `json:"labels" xorm:"json 'labels'"`
Dependencies []string `json:"dependencies" xorm:"json 'dependencies'"`
RunOn []string `json:"run_on" xorm:"json 'run_on'"`
@@ -41,6 +41,18 @@ func (t *Task) String() string {
return sb.String()
}
+func (t *Task) ApplyLabelsFromRepo(r *Repo) error {
+ if r == nil {
+ return fmt.Errorf("repo is nil but needed to get task labels")
+ }
+ if t.Labels == nil {
+ t.Labels = make(map[string]string)
+ }
+ t.Labels["repo"] = r.FullName
+ t.Labels[agentFilterOrgID] = fmt.Sprintf("%d", r.OrgID)
+ return nil
+}
+
// ShouldRun tells if a task should be run or skipped, based on dependencies.
func (t *Task) ShouldRun() bool {
if t.runsOnFailure() && t.runsOnSuccess() {
diff --git a/server/model/task_test.go b/server/model/task_test.go
new file mode 100644
index 000000000..c774934e4
--- /dev/null
+++ b/server/model/task_test.go
@@ -0,0 +1,87 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package model
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestTask_GetLabels(t *testing.T) {
+ t.Run("Nil Repo", func(t *testing.T) {
+ task := &Task{}
+ err := task.ApplyLabelsFromRepo(nil)
+
+ assert.Error(t, err)
+ assert.Nil(t, task.Labels)
+ assert.EqualError(t, err, "repo is nil but needed to get task labels")
+ })
+
+ t.Run("Empty Repo", func(t *testing.T) {
+ task := &Task{}
+ repo := &Repo{}
+
+ err := task.ApplyLabelsFromRepo(repo)
+
+ assert.NoError(t, err)
+ assert.NotNil(t, task.Labels)
+ assert.Equal(t, map[string]string{
+ "repo": "",
+ agentFilterOrgID: "0",
+ }, task.Labels)
+ })
+
+ t.Run("Empty Labels", func(t *testing.T) {
+ task := &Task{}
+ repo := &Repo{
+ FullName: "test/repo",
+ ID: 123,
+ OrgID: 456,
+ }
+
+ err := task.ApplyLabelsFromRepo(repo)
+
+ assert.NoError(t, err)
+ assert.NotNil(t, task.Labels)
+ assert.Equal(t, map[string]string{
+ "repo": "test/repo",
+ agentFilterOrgID: "456",
+ }, task.Labels)
+ })
+
+ t.Run("Existing Labels", func(t *testing.T) {
+ task := &Task{
+ Labels: map[string]string{
+ "existing": "label",
+ },
+ }
+ repo := &Repo{
+ FullName: "test/repo",
+ ID: 123,
+ OrgID: 456,
+ }
+
+ err := task.ApplyLabelsFromRepo(repo)
+
+ assert.NoError(t, err)
+ assert.NotNil(t, task.Labels)
+ assert.Equal(t, map[string]string{
+ "existing": "label",
+ "repo": "test/repo",
+ agentFilterOrgID: "456",
+ }, task.Labels)
+ })
+}
diff --git a/server/model/workflow.go b/server/model/workflow.go
index 7efd5f151..e6029ab69 100644
--- a/server/model/workflow.go
+++ b/server/model/workflow.go
@@ -23,8 +23,8 @@ type Workflow struct {
Name string `json:"name" xorm:"name"`
State StatusValue `json:"state" xorm:"state"`
Error string `json:"error,omitempty" xorm:"TEXT 'error'"`
- Started int64 `json:"start_time,omitempty" xorm:"started"`
- Finished int64 `json:"end_time,omitempty" xorm:"stopped"`
+ Started int64 `json:"started,omitempty" xorm:"started"`
+ Finished int64 `json:"finished,omitempty" xorm:"finished"`
AgentID int64 `json:"agent_id,omitempty" xorm:"agent_id"`
Platform string `json:"platform,omitempty" xorm:"platform"`
Environ map[string]string `json:"environ,omitempty" xorm:"json 'environ'"`
diff --git a/server/pipeline/approve.go b/server/pipeline/approve.go
index 374693a2c..d91840c7d 100644
--- a/server/pipeline/approve.go
+++ b/server/pipeline/approve.go
@@ -16,6 +16,7 @@ package pipeline
import (
"context"
+ "errors"
"fmt"
"github.com/rs/zerolog/log"
@@ -37,7 +38,7 @@ func Approve(ctx context.Context, store store.Store, currentPipeline *model.Pipe
if err != nil {
msg := fmt.Sprintf("failure to load forge for repo '%s'", repo.FullName)
log.Error().Err(err).Str("repo", repo.FullName).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
// fetch the pipeline file from the database
@@ -84,7 +85,7 @@ func Approve(ctx context.Context, store store.Store, currentPipeline *model.Pipe
if err != nil {
msg := fmt.Sprintf("failure to createPipelineItems for %s", repo.FullName)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
// we have no way to link old workflows and steps in database to new engine generated steps,
@@ -100,7 +101,7 @@ func Approve(ctx context.Context, store store.Store, currentPipeline *model.Pipe
if err != nil {
msg := fmt.Sprintf("failure to start pipeline for %s: %v", repo.FullName, err)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
return currentPipeline, nil
diff --git a/server/pipeline/create.go b/server/pipeline/create.go
index 2692d1117..0539e8d3c 100644
--- a/server/pipeline/create.go
+++ b/server/pipeline/create.go
@@ -38,7 +38,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline
if err != nil {
msg := fmt.Sprintf("failure to find repo owner via id '%d'", repo.UserID)
log.Error().Err(err).Str("repo", repo.FullName).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
if pipeline.Event == model.EventPush || pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed {
@@ -57,7 +57,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline
if err != nil {
msg := fmt.Sprintf("failure to load forge for repo '%s'", repo.FullName)
log.Error().Err(err).Str("repo", repo.FullName).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
// If the forge has a refresh token, the current access token
@@ -88,7 +88,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline
return nil, ErrFiltered
} else if configFetchErr != nil {
log.Debug().Str("repo", repo.FullName).Err(configFetchErr).Msgf("error while fetching config '%s' in '%s' with user: '%s'", repo.Config, pipeline.Ref, repoUser.Login)
- return nil, updatePipelineWithErr(ctx, _forge, _store, pipeline, repo, repoUser, fmt.Errorf("pipeline definition not found in %s", repo.FullName))
+ return nil, updatePipelineWithErr(ctx, _forge, _store, pipeline, repo, repoUser, fmt.Errorf("could not load config from forge: %w", err))
}
pipelineItems, parseErr := parsePipeline(_forge, _store, pipeline, repoUser, repo, forgeYamlConfigs, nil)
@@ -117,7 +117,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline
if err != nil {
msg := fmt.Sprintf("failed to find or persist pipeline config for %s", repo.FullName)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
configs = append(configs, config)
}
@@ -125,7 +125,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline
if err := linkPipelineConfigs(_store, configs, pipeline.ID); err != nil {
msg := fmt.Sprintf("failed to find or persist pipeline config for %s", repo.FullName)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
if err := prepareStart(ctx, _forge, _store, pipeline, repoUser, repo); err != nil {
@@ -145,7 +145,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline
if err != nil {
msg := fmt.Sprintf("failed to start pipeline for %s", repo.FullName)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
return pipeline, nil
diff --git a/server/pipeline/decline.go b/server/pipeline/decline.go
index 1f9611c5c..a4f7e48a3 100644
--- a/server/pipeline/decline.go
+++ b/server/pipeline/decline.go
@@ -16,6 +16,7 @@ package pipeline
import (
"context"
+ "errors"
"fmt"
"github.com/rs/zerolog/log"
@@ -31,7 +32,7 @@ func Decline(ctx context.Context, store store.Store, pipeline *model.Pipeline, u
if err != nil {
msg := fmt.Sprintf("failure to load forge for repo '%s'", repo.FullName)
log.Error().Err(err).Str("repo", repo.FullName).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
if pipeline.Status != model.StatusBlocked {
diff --git a/server/pipeline/items.go b/server/pipeline/items.go
index b6b2dc917..70e31f348 100644
--- a/server/pipeline/items.go
+++ b/server/pipeline/items.go
@@ -38,7 +38,7 @@ func parsePipeline(forge forge.Forge, store store.Store, currentPipeline *model.
}
// get the previous pipeline so that we can send status change notifications
- last, err := store.GetPipelineLastBefore(repo, currentPipeline.Branch, currentPipeline.ID)
+ prev, err := store.GetPipelineLastBefore(repo, currentPipeline.Branch, currentPipeline.ID)
if err != nil && !errors.Is(err, sql.ErrNoRows) {
log.Error().Err(err).Str("repo", repo.FullName).Msgf("error getting last pipeline before pipeline number '%d'", currentPipeline.Number)
}
@@ -74,7 +74,7 @@ func parsePipeline(forge forge.Forge, store store.Store, currentPipeline *model.
b := stepbuilder.StepBuilder{
Repo: repo,
Curr: currentPipeline,
- Last: last,
+ Prev: prev,
Netrc: netrc,
Secs: secs,
Regs: regs,
diff --git a/server/pipeline/queue.go b/server/pipeline/queue.go
index 73bf30fd8..a17669a1f 100644
--- a/server/pipeline/queue.go
+++ b/server/pipeline/queue.go
@@ -18,6 +18,7 @@ import (
"context"
"encoding/json"
"fmt"
+ "maps"
"go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc"
"go.woodpecker-ci.org/woodpecker/v2/server"
@@ -31,18 +32,19 @@ func queuePipeline(ctx context.Context, repo *model.Repo, pipelineItems []*stepb
if item.Workflow.State == model.StatusSkipped {
continue
}
- task := new(model.Task)
- task.ID = fmt.Sprint(item.Workflow.ID)
- task.Labels = map[string]string{}
- for k, v := range item.Labels {
- task.Labels[k] = v
+ task := &model.Task{
+ ID: fmt.Sprint(item.Workflow.ID),
+ Labels: make(map[string]string),
+ }
+ maps.Copy(task.Labels, item.Labels)
+ err := task.ApplyLabelsFromRepo(repo)
+ if err != nil {
+ return err
}
- task.Labels["repo"] = repo.FullName
task.Dependencies = taskIDs(item.DependsOn, pipelineItems)
task.RunOn = item.RunsOn
task.DepStatus = make(map[string]model.StatusValue)
- var err error
task.Data, err = json.Marshal(rpc.Workflow{
ID: fmt.Sprint(item.Workflow.ID),
Config: item.Config,
diff --git a/server/pipeline/restart.go b/server/pipeline/restart.go
index e8b841bf1..3c997a290 100644
--- a/server/pipeline/restart.go
+++ b/server/pipeline/restart.go
@@ -33,13 +33,11 @@ func Restart(ctx context.Context, store store.Store, lastPipeline *model.Pipelin
if err != nil {
msg := fmt.Sprintf("failure to load forge for repo '%s'", repo.FullName)
log.Error().Err(err).Str("repo", repo.FullName).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
- switch lastPipeline.Status {
- case model.StatusDeclined,
- model.StatusBlocked:
- return nil, &ErrBadRequest{Msg: fmt.Sprintf("cannot restart a pipeline with status %s", lastPipeline.Status)}
+ if lastPipeline.Status == model.StatusBlocked {
+ return nil, &ErrBadRequest{Msg: "cannot restart a pipeline with status blocked"}
}
// fetch the old pipeline config from the database
@@ -70,7 +68,7 @@ func Restart(ctx context.Context, store store.Store, lastPipeline *model.Pipelin
if err != nil {
msg := fmt.Sprintf("failure to save pipeline for %s", repo.FullName)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
if len(configs) == 0 {
@@ -85,27 +83,27 @@ func Restart(ctx context.Context, store store.Store, lastPipeline *model.Pipelin
if err := linkPipelineConfigs(store, configs, newPipeline.ID); err != nil {
msg := fmt.Sprintf("failure to persist pipeline config for %s.", repo.FullName)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
newPipeline, pipelineItems, err := createPipelineItems(ctx, forge, store, newPipeline, user, repo, pipelineFiles, envs)
if err != nil {
msg := fmt.Sprintf("failure to createPipelineItems for %s", repo.FullName)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
if err := prepareStart(ctx, forge, store, newPipeline, user, repo); err != nil {
msg := fmt.Sprintf("failure to prepare pipeline for %s", repo.FullName)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
newPipeline, err = start(ctx, forge, store, newPipeline, user, repo, pipelineItems)
if err != nil {
msg := fmt.Sprintf("failure to start pipeline for %s", repo.FullName)
log.Error().Err(err).Msg(msg)
- return nil, fmt.Errorf(msg)
+ return nil, errors.New(msg)
}
return newPipeline, nil
diff --git a/server/pipeline/stepbuilder/metadata.go b/server/pipeline/stepbuilder/metadata.go
index 6e48e4158..52d79b4bb 100644
--- a/server/pipeline/stepbuilder/metadata.go
+++ b/server/pipeline/stepbuilder/metadata.go
@@ -25,7 +25,7 @@ import (
)
// MetadataFromStruct return the metadata from a pipeline will run with.
-func MetadataFromStruct(forge metadata.ServerForge, repo *model.Repo, pipeline, last *model.Pipeline, workflow *model.Workflow, sysURL string) metadata.Metadata {
+func MetadataFromStruct(forge metadata.ServerForge, repo *model.Repo, pipeline, prev *model.Pipeline, workflow *model.Workflow, sysURL string) metadata.Metadata {
host := sysURL
uri, err := url.Parse(sysURL)
if err == nil {
@@ -48,11 +48,16 @@ func MetadataFromStruct(forge metadata.ServerForge, repo *model.Repo, pipeline,
Owner: repo.Owner,
RemoteID: fmt.Sprint(repo.ForgeRemoteID),
ForgeURL: repo.ForgeURL,
+ SCM: string(repo.SCMKind),
CloneURL: repo.Clone,
CloneSSHURL: repo.CloneSSH,
Private: repo.IsSCMPrivate,
Branch: repo.Branch,
- Trusted: repo.IsTrusted,
+ Trusted: metadata.TrustedConfiguration{
+ Network: repo.Trusted.Network,
+ Volumes: repo.Trusted.Volumes,
+ Security: repo.Trusted.Security,
+ },
}
if idx := strings.LastIndex(repo.FullName, "/"); idx != -1 {
@@ -77,7 +82,7 @@ func MetadataFromStruct(forge metadata.ServerForge, repo *model.Repo, pipeline,
return metadata.Metadata{
Repo: fRepo,
Curr: metadataPipelineFromModelPipeline(pipeline, true),
- Prev: metadataPipelineFromModelPipeline(last, false),
+ Prev: metadataPipelineFromModelPipeline(prev, false),
Workflow: fWorkflow,
Step: metadata.Step{},
Sys: metadata.System{
diff --git a/server/pipeline/stepbuilder/metadata_test.go b/server/pipeline/stepbuilder/metadata_test.go
index a0d451425..1111a5603 100644
--- a/server/pipeline/stepbuilder/metadata_test.go
+++ b/server/pipeline/stepbuilder/metadata_test.go
@@ -33,7 +33,7 @@ func TestMetadataFromStruct(t *testing.T) {
name string
forge metadata.ServerForge
repo *model.Repo
- pipeline, last *model.Pipeline
+ pipeline, prev *model.Pipeline
workflow *model.Workflow
sysURL string
expectedMetadata metadata.Metadata
@@ -46,30 +46,31 @@ func TestMetadataFromStruct(t *testing.T) {
"CI": "woodpecker",
"CI_COMMIT_AUTHOR": "", "CI_COMMIT_AUTHOR_AVATAR": "", "CI_COMMIT_AUTHOR_EMAIL": "", "CI_COMMIT_BRANCH": "",
"CI_COMMIT_MESSAGE": "", "CI_COMMIT_PULL_REQUEST": "", "CI_COMMIT_PULL_REQUEST_LABELS": "", "CI_COMMIT_REF": "", "CI_COMMIT_REFSPEC": "", "CI_COMMIT_SHA": "", "CI_COMMIT_SOURCE_BRANCH": "",
- "CI_COMMIT_TAG": "", "CI_COMMIT_TARGET_BRANCH": "", "CI_COMMIT_URL": "", "CI_FORGE_TYPE": "", "CI_FORGE_URL": "",
- "CI_PIPELINE_CREATED": "0", "CI_PIPELINE_DEPLOY_TARGET": "", "CI_PIPELINE_DEPLOY_TASK": "", "CI_PIPELINE_EVENT": "", "CI_PIPELINE_FINISHED": "0", "CI_PIPELINE_FILES": "[]", "CI_PIPELINE_NUMBER": "0",
- "CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_STATUS": "", "CI_PIPELINE_URL": "/repos/0/pipeline/0", "CI_PIPELINE_FORGE_URL": "",
- "CI_PREV_COMMIT_AUTHOR": "", "CI_PREV_COMMIT_AUTHOR_AVATAR": "", "CI_PREV_COMMIT_AUTHOR_EMAIL": "", "CI_PREV_COMMIT_BRANCH": "",
+ "CI_COMMIT_TAG": "", "CI_COMMIT_TARGET_BRANCH": "", "CI_FORGE_TYPE": "", "CI_FORGE_URL": "",
+ "CI_PIPELINE_CREATED": "0", "CI_PIPELINE_DEPLOY_TARGET": "", "CI_PIPELINE_DEPLOY_TASK": "", "CI_PIPELINE_EVENT": "", "CI_PIPELINE_FILES": "[]", "CI_PIPELINE_NUMBER": "0",
+ "CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_URL": "/repos/0/pipeline/0", "CI_PIPELINE_FORGE_URL": "",
+ "CI_PREV_COMMIT_AUTHOR": "", "CI_PREV_COMMIT_AUTHOR_AVATAR": "", "CI_PREV_COMMIT_AUTHOR_EMAIL": "", "CI_PREV_COMMIT_BRANCH": "", "CI_PREV_COMMIT_SOURCE_BRANCH": "", "CI_PREV_COMMIT_TARGET_BRANCH": "",
"CI_PREV_COMMIT_MESSAGE": "", "CI_PREV_COMMIT_REF": "", "CI_PREV_COMMIT_REFSPEC": "", "CI_PREV_COMMIT_SHA": "", "CI_PREV_COMMIT_URL": "", "CI_PREV_PIPELINE_CREATED": "0",
"CI_PREV_PIPELINE_DEPLOY_TARGET": "", "CI_PREV_PIPELINE_DEPLOY_TASK": "", "CI_PREV_PIPELINE_EVENT": "", "CI_PREV_PIPELINE_FINISHED": "0", "CI_PREV_PIPELINE_NUMBER": "0", "CI_PREV_PIPELINE_PARENT": "0",
"CI_PREV_PIPELINE_STARTED": "0", "CI_PREV_PIPELINE_STATUS": "", "CI_PREV_PIPELINE_URL": "/repos/0/pipeline/0", "CI_PREV_PIPELINE_FORGE_URL": "", "CI_REPO": "", "CI_REPO_CLONE_URL": "", "CI_REPO_CLONE_SSH_URL": "", "CI_REPO_DEFAULT_BRANCH": "", "CI_REPO_REMOTE_ID": "",
- "CI_REPO_NAME": "", "CI_REPO_OWNER": "", "CI_REPO_PRIVATE": "false", "CI_REPO_SCM": "git", "CI_REPO_TRUSTED": "false", "CI_REPO_URL": "", "CI_STEP_FINISHED": "",
- "CI_STEP_NAME": "", "CI_STEP_NUMBER": "0", "CI_STEP_STARTED": "", "CI_STEP_STATUS": "", "CI_STEP_URL": "/repos/0/pipeline/0", "CI_SYSTEM_HOST": "", "CI_SYSTEM_NAME": "woodpecker",
+ "CI_REPO_NAME": "", "CI_REPO_OWNER": "", "CI_REPO_PRIVATE": "false", "CI_REPO_SCM": "", "CI_REPO_TRUSTED": "false", "CI_REPO_TRUSTED_NETWORK": "false",
+ "CI_REPO_TRUSTED_VOLUMES": "false", "CI_REPO_TRUSTED_SECURITY": "false", "CI_REPO_URL": "",
+ "CI_STEP_NAME": "", "CI_STEP_NUMBER": "0", "CI_STEP_STARTED": "", "CI_STEP_URL": "/repos/0/pipeline/0", "CI_SYSTEM_HOST": "", "CI_SYSTEM_NAME": "woodpecker",
"CI_SYSTEM_PLATFORM": "", "CI_SYSTEM_URL": "", "CI_SYSTEM_VERSION": "", "CI_WORKFLOW_NAME": "", "CI_WORKFLOW_NUMBER": "0",
},
},
{
name: "Test with forge",
forge: forge,
- repo: &model.Repo{FullName: "testUser/testRepo", ForgeURL: "https://gitea.com/testUser/testRepo", Clone: "https://gitea.com/testUser/testRepo.git", CloneSSH: "git@gitea.com:testUser/testRepo.git", Branch: "main", IsSCMPrivate: true},
+ repo: &model.Repo{FullName: "testUser/testRepo", ForgeURL: "https://gitea.com/testUser/testRepo", Clone: "https://gitea.com/testUser/testRepo.git", CloneSSH: "git@gitea.com:testUser/testRepo.git", Branch: "main", IsSCMPrivate: true, SCMKind: "git"},
pipeline: &model.Pipeline{Number: 3, ChangedFiles: []string{"test.go", "markdown file.md"}},
- last: &model.Pipeline{Number: 2},
+ prev: &model.Pipeline{Number: 2},
workflow: &model.Workflow{Name: "hello"},
sysURL: "https://example.com",
expectedMetadata: metadata.Metadata{
Forge: metadata.Forge{Type: "gitea", URL: "https://gitea.com"},
Sys: metadata.System{Name: "woodpecker", Host: "example.com", URL: "https://example.com"},
- Repo: metadata.Repo{Owner: "testUser", Name: "testRepo", ForgeURL: "https://gitea.com/testUser/testRepo", CloneURL: "https://gitea.com/testUser/testRepo.git", CloneSSHURL: "git@gitea.com:testUser/testRepo.git", Branch: "main", Private: true},
+ Repo: metadata.Repo{Owner: "testUser", Name: "testRepo", ForgeURL: "https://gitea.com/testUser/testRepo", CloneURL: "https://gitea.com/testUser/testRepo.git", CloneSSHURL: "git@gitea.com:testUser/testRepo.git", Branch: "main", Private: true, SCM: "git"},
Curr: metadata.Pipeline{
Number: 3,
Commit: metadata.Commit{ChangedFiles: []string{"test.go", "markdown file.md"}},
@@ -81,16 +82,18 @@ func TestMetadataFromStruct(t *testing.T) {
"CI": "woodpecker",
"CI_COMMIT_AUTHOR": "", "CI_COMMIT_AUTHOR_AVATAR": "", "CI_COMMIT_AUTHOR_EMAIL": "", "CI_COMMIT_BRANCH": "",
"CI_COMMIT_MESSAGE": "", "CI_COMMIT_PULL_REQUEST": "", "CI_COMMIT_PULL_REQUEST_LABELS": "", "CI_COMMIT_REF": "", "CI_COMMIT_REFSPEC": "", "CI_COMMIT_SHA": "", "CI_COMMIT_SOURCE_BRANCH": "",
- "CI_COMMIT_TAG": "", "CI_COMMIT_TARGET_BRANCH": "", "CI_COMMIT_URL": "", "CI_FORGE_TYPE": "gitea", "CI_FORGE_URL": "https://gitea.com",
- "CI_PIPELINE_CREATED": "0", "CI_PIPELINE_DEPLOY_TARGET": "", "CI_PIPELINE_DEPLOY_TASK": "", "CI_PIPELINE_EVENT": "", "CI_PIPELINE_FINISHED": "0", "CI_PIPELINE_FILES": `["test.go","markdown file.md"]`,
- "CI_PIPELINE_NUMBER": "3", "CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_STATUS": "", "CI_PIPELINE_URL": "https://example.com/repos/0/pipeline/3", "CI_PIPELINE_FORGE_URL": "",
- "CI_PREV_COMMIT_AUTHOR": "", "CI_PREV_COMMIT_AUTHOR_AVATAR": "", "CI_PREV_COMMIT_AUTHOR_EMAIL": "", "CI_PREV_COMMIT_BRANCH": "",
+ "CI_COMMIT_TAG": "", "CI_COMMIT_TARGET_BRANCH": "", "CI_FORGE_TYPE": "gitea", "CI_FORGE_URL": "https://gitea.com",
+ "CI_PIPELINE_CREATED": "0", "CI_PIPELINE_DEPLOY_TARGET": "", "CI_PIPELINE_DEPLOY_TASK": "", "CI_PIPELINE_EVENT": "", "CI_PIPELINE_FILES": `["test.go","markdown file.md"]`,
+ "CI_PIPELINE_NUMBER": "3", "CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_URL": "https://example.com/repos/0/pipeline/3", "CI_PIPELINE_FORGE_URL": "",
+ "CI_PREV_COMMIT_AUTHOR": "", "CI_PREV_COMMIT_AUTHOR_AVATAR": "", "CI_PREV_COMMIT_AUTHOR_EMAIL": "", "CI_PREV_COMMIT_BRANCH": "", "CI_PREV_COMMIT_SOURCE_BRANCH": "", "CI_PREV_COMMIT_TARGET_BRANCH": "",
"CI_PREV_COMMIT_MESSAGE": "", "CI_PREV_COMMIT_REF": "", "CI_PREV_COMMIT_REFSPEC": "", "CI_PREV_COMMIT_SHA": "", "CI_PREV_COMMIT_URL": "", "CI_PREV_PIPELINE_CREATED": "0",
"CI_PREV_PIPELINE_DEPLOY_TARGET": "", "CI_PREV_PIPELINE_DEPLOY_TASK": "", "CI_PREV_PIPELINE_EVENT": "", "CI_PREV_PIPELINE_FINISHED": "0", "CI_PREV_PIPELINE_NUMBER": "2", "CI_PREV_PIPELINE_PARENT": "0",
"CI_PREV_PIPELINE_STARTED": "0", "CI_PREV_PIPELINE_STATUS": "", "CI_PREV_PIPELINE_URL": "https://example.com/repos/0/pipeline/2", "CI_PREV_PIPELINE_FORGE_URL": "", "CI_REPO": "testUser/testRepo", "CI_REPO_CLONE_URL": "https://gitea.com/testUser/testRepo.git", "CI_REPO_CLONE_SSH_URL": "git@gitea.com:testUser/testRepo.git",
"CI_REPO_DEFAULT_BRANCH": "main", "CI_REPO_NAME": "testRepo", "CI_REPO_OWNER": "testUser", "CI_REPO_PRIVATE": "true", "CI_REPO_REMOTE_ID": "",
- "CI_REPO_SCM": "git", "CI_REPO_TRUSTED": "false", "CI_REPO_URL": "https://gitea.com/testUser/testRepo", "CI_STEP_FINISHED": "",
- "CI_STEP_NAME": "", "CI_STEP_NUMBER": "0", "CI_STEP_STARTED": "", "CI_STEP_STATUS": "", "CI_STEP_URL": "https://example.com/repos/0/pipeline/3", "CI_SYSTEM_HOST": "example.com",
+ "CI_REPO_SCM": "git", "CI_REPO_TRUSTED": "false", "CI_REPO_TRUSTED_NETWORK": "false",
+ "CI_REPO_TRUSTED_VOLUMES": "false", "CI_REPO_TRUSTED_SECURITY": "false",
+ "CI_REPO_URL": "https://gitea.com/testUser/testRepo",
+ "CI_STEP_NAME": "", "CI_STEP_NUMBER": "0", "CI_STEP_STARTED": "", "CI_STEP_URL": "https://example.com/repos/0/pipeline/3", "CI_SYSTEM_HOST": "example.com",
"CI_SYSTEM_NAME": "woodpecker", "CI_SYSTEM_PLATFORM": "", "CI_SYSTEM_URL": "https://example.com", "CI_SYSTEM_VERSION": "", "CI_WORKFLOW_NAME": "hello", "CI_WORKFLOW_NUMBER": "0",
},
},
@@ -98,7 +101,7 @@ func TestMetadataFromStruct(t *testing.T) {
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
- result := MetadataFromStruct(testCase.forge, testCase.repo, testCase.pipeline, testCase.last, testCase.workflow, testCase.sysURL)
+ result := MetadataFromStruct(testCase.forge, testCase.repo, testCase.pipeline, testCase.prev, testCase.workflow, testCase.sysURL)
assert.EqualValues(t, testCase.expectedMetadata, result)
assert.EqualValues(t, testCase.expectedEnviron, result.Environ())
})
diff --git a/server/pipeline/stepbuilder/stepBuilder.go b/server/pipeline/stepbuilder/stepBuilder.go
index 593ff0fc1..8adc1d71b 100644
--- a/server/pipeline/stepbuilder/stepBuilder.go
+++ b/server/pipeline/stepbuilder/stepBuilder.go
@@ -42,7 +42,7 @@ import (
type StepBuilder struct {
Repo *model.Repo
Curr *model.Pipeline
- Last *model.Pipeline
+ Prev *model.Pipeline
Netrc *model.Netrc
Secs []*model.Secret
Regs []*model.Registry
@@ -115,7 +115,7 @@ func (b *StepBuilder) Build() (items []*Item, errorsAndWarnings error) {
}
func (b *StepBuilder) genItemForWorkflow(workflow *model.Workflow, axis matrix.Axis, data string) (item *Item, errorsAndWarnings error) {
- workflowMetadata := MetadataFromStruct(b.Forge, b.Repo, b.Curr, b.Last, workflow, b.Host)
+ workflowMetadata := MetadataFromStruct(b.Forge, b.Repo, b.Curr, b.Prev, workflow, b.Host)
environ := b.environmentVariables(workflowMetadata, axis)
// add global environment variables for substituting
@@ -141,7 +141,13 @@ func (b *StepBuilder) genItemForWorkflow(workflow *model.Workflow, axis matrix.A
// lint pipeline
errorsAndWarnings = multierr.Append(errorsAndWarnings, linter.New(
- linter.WithTrusted(b.Repo.IsTrusted),
+ linter.WithTrusted(linter.TrustedConfiguration{
+ Network: b.Repo.Trusted.Network,
+ Volumes: b.Repo.Trusted.Volumes,
+ Security: b.Repo.Trusted.Security,
+ }),
+ linter.PrivilegedPlugins(server.Config.Pipeline.PrivilegedPlugins),
+ linter.WithTrustedClonePlugins(server.Config.Pipeline.TrustedClonePlugins),
).Lint([]*linter.WorkflowConfig{{
Workflow: parsed,
File: workflow.Name,
@@ -267,8 +273,7 @@ func (b *StepBuilder) toInternalRepresentation(parsed *yaml_types.Workflow, envi
compiler.WithEnviron(environ),
compiler.WithEnviron(b.Envs),
// TODO: server deps should be moved into StepBuilder fields and set on StepBuilder creation
- compiler.WithEscalated(server.Config.Pipeline.Privileged...),
- compiler.WithResourceLimit(server.Config.Pipeline.Limits.MemSwapLimit, server.Config.Pipeline.Limits.MemLimit, server.Config.Pipeline.Limits.ShmSize, server.Config.Pipeline.Limits.CPUQuota, server.Config.Pipeline.Limits.CPUShares, server.Config.Pipeline.Limits.CPUSet),
+ compiler.WithEscalated(server.Config.Pipeline.PrivilegedPlugins...),
compiler.WithVolumes(server.Config.Pipeline.Volumes...),
compiler.WithNetworks(server.Config.Pipeline.Networks...),
compiler.WithLocal(false),
@@ -280,7 +285,8 @@ func (b *StepBuilder) toInternalRepresentation(parsed *yaml_types.Workflow, envi
),
b.Repo.IsSCMPrivate || server.Config.Pipeline.AuthenticatePublicRepos,
),
- compiler.WithDefaultCloneImage(server.Config.Pipeline.DefaultCloneImage),
+ compiler.WithDefaultClonePlugin(server.Config.Pipeline.DefaultClonePlugin),
+ compiler.WithTrustedClonePlugins(server.Config.Pipeline.TrustedClonePlugins),
compiler.WithRegistry(registries...),
compiler.WithSecret(secrets...),
compiler.WithPrefix(
@@ -293,7 +299,7 @@ func (b *StepBuilder) toInternalRepresentation(parsed *yaml_types.Workflow, envi
compiler.WithProxy(b.ProxyOpts),
compiler.WithWorkspaceFromURL(compiler.DefaultWorkspaceBase, b.Repo.ForgeURL),
compiler.WithMetadata(metadata),
- compiler.WithTrusted(b.Repo.IsTrusted),
+ compiler.WithTrustedSecurity(b.Repo.Trusted.Security),
compiler.WithNetrcOnlyTrusted(b.Repo.NetrcOnlyTrusted),
).Compile(parsed)
}
diff --git a/server/pipeline/stepbuilder/stepBuilder_test.go b/server/pipeline/stepbuilder/stepBuilder_test.go
index 98cb79129..c9b616e4d 100644
--- a/server/pipeline/stepbuilder/stepBuilder_test.go
+++ b/server/pipeline/stepbuilder/stepBuilder_test.go
@@ -42,7 +42,7 @@ func TestGlobalEnvsubst(t *testing.T) {
Message: "aaa",
Event: model.EventPush,
},
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -81,7 +81,7 @@ func TestMissingGlobalEnvsubst(t *testing.T) {
Message: "aaa",
Event: model.EventPush,
},
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -116,7 +116,7 @@ func TestMultilineEnvsubst(t *testing.T) {
Message: `aaa
bbb`,
},
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -159,7 +159,7 @@ func TestMultiPipeline(t *testing.T) {
Curr: &model.Pipeline{
Event: model.EventPush,
},
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -200,7 +200,7 @@ func TestDependsOn(t *testing.T) {
Curr: &model.Pipeline{
Event: model.EventPush,
},
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -255,7 +255,7 @@ func TestRunsOn(t *testing.T) {
Curr: &model.Pipeline{
Event: model.EventPush,
},
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -296,7 +296,7 @@ func TestPipelineName(t *testing.T) {
Curr: &model.Pipeline{
Event: model.EventPush,
},
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -339,7 +339,7 @@ func TestBranchFilter(t *testing.T) {
Branch: "dev",
Event: model.EventPush,
},
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -348,10 +348,10 @@ func TestBranchFilter(t *testing.T) {
{Data: []byte(`
when:
event: push
+ branch: main
steps:
xxx:
image: scratch
-branches: main
`)},
{Data: []byte(`
when:
@@ -382,7 +382,7 @@ func TestRootWhenFilter(t *testing.T) {
Forge: getMockForge(t),
Repo: &model.Repo{},
Curr: &model.Pipeline{Event: "tag"},
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -432,7 +432,7 @@ func TestZeroSteps(t *testing.T) {
Forge: getMockForge(t),
Repo: &model.Repo{},
Curr: pipeline,
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -472,7 +472,7 @@ func TestZeroStepsAsMultiPipelineDeps(t *testing.T) {
Forge: getMockForge(t),
Repo: &model.Repo{},
Curr: pipeline,
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
@@ -530,7 +530,7 @@ func TestZeroStepsAsMultiPipelineTransitiveDeps(t *testing.T) {
Forge: getMockForge(t),
Repo: &model.Repo{},
Curr: pipeline,
- Last: &model.Pipeline{},
+ Prev: &model.Pipeline{},
Netrc: &model.Netrc{},
Secs: []*model.Secret{},
Regs: []*model.Registry{},
diff --git a/server/queue/fifo.go b/server/queue/fifo.go
index d6fe664c9..d9acc66a4 100644
--- a/server/queue/fifo.go
+++ b/server/queue/fifo.go
@@ -24,6 +24,7 @@ import (
"github.com/rs/zerolog/log"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
+ "go.woodpecker-ci.org/woodpecker/v2/shared/constant"
)
type entry struct {
@@ -43,6 +44,7 @@ type worker struct {
type fifo struct {
sync.Mutex
+ ctx context.Context
workers map[*worker]struct{}
running map[string]*entry
pending *list.List
@@ -51,18 +53,25 @@ type fifo struct {
paused bool
}
-// New returns a new fifo queue.
-//
-//nolint:mnd
-func New(_ context.Context) Queue {
- return &fifo{
+// processTimeInterval is the time till the queue rearranges things,
+// as the agent pull in 10 milliseconds we should also give them work asap.
+const processTimeInterval = 100 * time.Millisecond
+
+var ErrWorkerKicked = fmt.Errorf("worker was kicked")
+
+// NewMemoryQueue returns a new fifo queue.
+func NewMemoryQueue(ctx context.Context) Queue {
+ q := &fifo{
+ ctx: ctx,
workers: map[*worker]struct{}{},
running: map[string]*entry{},
pending: list.New(),
waitingOnDeps: list.New(),
- extension: time.Minute * 10,
+ extension: constant.TaskTimeout,
paused: false,
}
+ go q.process()
+ return q
}
// Push pushes a task to the tail of this queue.
@@ -70,7 +79,6 @@ func (q *fifo) Push(_ context.Context, task *model.Task) error {
q.Lock()
q.pending.PushBack(task)
q.Unlock()
- go q.process()
return nil
}
@@ -81,33 +89,31 @@ func (q *fifo) PushAtOnce(_ context.Context, tasks []*model.Task) error {
q.pending.PushBack(task)
}
q.Unlock()
- go q.process()
return nil
}
// Poll retrieves and removes a task head of this queue.
-func (q *fifo) Poll(c context.Context, agentID int64, f FilterFn) (*model.Task, error) {
+func (q *fifo) Poll(c context.Context, agentID int64, filter FilterFn) (*model.Task, error) {
q.Lock()
ctx, stop := context.WithCancelCause(c)
- w := &worker{
+ _worker := &worker{
agentID: agentID,
channel: make(chan *model.Task, 1),
- filter: f,
+ filter: filter,
stop: stop,
}
- q.workers[w] = struct{}{}
+ q.workers[_worker] = struct{}{}
q.Unlock()
- go q.process()
for {
select {
case <-ctx.Done():
q.Lock()
- delete(q.workers, w)
+ delete(q.workers, _worker)
q.Unlock()
return nil, ctx.Err()
- case t := <-w.channel:
+ case t := <-_worker.channel:
return t, nil
}
}
@@ -148,22 +154,22 @@ func (q *fifo) finished(ids []string, exitStatus model.StatusValue, err error) e
}
// Evict removes a pending task from the queue.
-func (q *fifo) Evict(c context.Context, id string) error {
- return q.EvictAtOnce(c, []string{id})
+func (q *fifo) Evict(ctx context.Context, taskID string) error {
+ return q.EvictAtOnce(ctx, []string{taskID})
}
// EvictAtOnce removes multiple pending tasks from the queue.
-func (q *fifo) EvictAtOnce(_ context.Context, ids []string) error {
+func (q *fifo) EvictAtOnce(_ context.Context, taskIDs []string) error {
q.Lock()
defer q.Unlock()
- for _, id := range ids {
+ for _, id := range taskIDs {
var next *list.Element
- for e := q.pending.Front(); e != nil; e = next {
- next = e.Next()
- task, ok := e.Value.(*model.Task)
+ for element := q.pending.Front(); element != nil; element = next {
+ next = element.Next()
+ task, ok := element.Value.(*model.Task)
if ok && task.ID == id {
- q.pending.Remove(e)
+ q.pending.Remove(element)
return nil
}
}
@@ -172,13 +178,13 @@ func (q *fifo) EvictAtOnce(_ context.Context, ids []string) error {
}
// Wait waits until the item is done executing.
-func (q *fifo) Wait(c context.Context, id string) error {
+func (q *fifo) Wait(ctx context.Context, taskID string) error {
q.Lock()
- state := q.running[id]
+ state := q.running[taskID]
q.Unlock()
if state != nil {
select {
- case <-c.Done():
+ case <-ctx.Done():
case <-state.done:
return state.error
}
@@ -187,12 +193,16 @@ func (q *fifo) Wait(c context.Context, id string) error {
}
// Extend extends the task execution deadline.
-func (q *fifo) Extend(_ context.Context, id string) error {
+func (q *fifo) Extend(_ context.Context, agentID int64, taskID string) error {
q.Lock()
defer q.Unlock()
- state, ok := q.running[id]
+ state, ok := q.running[taskID]
if ok {
+ if state.item.AgentID != agentID {
+ return ErrAgentMissMatch
+ }
+
state.deadline = time.Now().Add(q.extension)
return nil
}
@@ -208,12 +218,12 @@ func (q *fifo) Info(_ context.Context) InfoT {
stats.Stats.WaitingOnDeps = q.waitingOnDeps.Len()
stats.Stats.Running = len(q.running)
- for e := q.pending.Front(); e != nil; e = e.Next() {
- task, _ := e.Value.(*model.Task)
+ for element := q.pending.Front(); element != nil; element = element.Next() {
+ task, _ := element.Value.(*model.Task)
stats.Pending = append(stats.Pending, task)
}
- for e := q.waitingOnDeps.Front(); e != nil; e = e.Next() {
- task, _ := e.Value.(*model.Task)
+ for element := q.waitingOnDeps.Front(); element != nil; element = element.Next() {
+ task, _ := element.Value.(*model.Task)
stats.WaitingOnDeps = append(stats.WaitingOnDeps, task)
}
for _, entry := range q.running {
@@ -237,7 +247,6 @@ func (q *fifo) Resume() {
q.Lock()
q.paused = false
q.Unlock()
- go q.process()
}
// KickAgentWorkers kicks all workers for a given agent.
@@ -245,37 +254,45 @@ func (q *fifo) KickAgentWorkers(agentID int64) {
q.Lock()
defer q.Unlock()
- for w := range q.workers {
- if w.agentID == agentID {
- w.stop(fmt.Errorf("worker was kicked"))
- delete(q.workers, w)
+ for worker := range q.workers {
+ if worker.agentID == agentID {
+ worker.stop(ErrWorkerKicked)
+ delete(q.workers, worker)
}
}
}
// helper function that loops through the queue and attempts to
-// match the item to a single subscriber.
+// match the item to a single subscriber until context got cancel.
func (q *fifo) process() {
- q.Lock()
- defer q.Unlock()
-
- if q.paused {
- return
- }
-
- q.resubmitExpiredPipelines()
- q.filterWaiting()
- for pending, worker := q.assignToWorker(); pending != nil && worker != nil; pending, worker = q.assignToWorker() {
- task, _ := pending.Value.(*model.Task)
- task.AgentID = worker.agentID
- delete(q.workers, worker)
- q.pending.Remove(pending)
- q.running[task.ID] = &entry{
- item: task,
- done: make(chan bool),
- deadline: time.Now().Add(q.extension),
+ for {
+ select {
+ case <-time.After(processTimeInterval):
+ case <-q.ctx.Done():
+ return
}
- worker.channel <- task
+
+ q.Lock()
+ if q.paused {
+ q.Unlock()
+ continue
+ }
+
+ q.resubmitExpiredPipelines()
+ q.filterWaiting()
+ for pending, worker := q.assignToWorker(); pending != nil && worker != nil; pending, worker = q.assignToWorker() {
+ task, _ := pending.Value.(*model.Task)
+ task.AgentID = worker.agentID
+ delete(q.workers, worker)
+ q.pending.Remove(pending)
+ q.running[task.ID] = &entry{
+ item: task,
+ done: make(chan bool),
+ deadline: time.Now().Add(q.extension),
+ }
+ worker.channel <- task
+ }
+ q.Unlock()
}
}
@@ -292,13 +309,13 @@ func (q *fifo) filterWaiting() {
q.waitingOnDeps = list.New()
var filtered []*list.Element
var nextPending *list.Element
- for e := q.pending.Front(); e != nil; e = nextPending {
- nextPending = e.Next()
- task, _ := e.Value.(*model.Task)
+ for element := q.pending.Front(); element != nil; element = nextPending {
+ nextPending = element.Next()
+ task, _ := element.Value.(*model.Task)
if q.depsInQueue(task) {
log.Debug().Msgf("queue: waiting due to unmet dependencies %v", task.ID)
q.waitingOnDeps.PushBack(task)
- filtered = append(filtered, e)
+ filtered = append(filtered, element)
}
}
@@ -310,37 +327,45 @@ func (q *fifo) filterWaiting() {
func (q *fifo) assignToWorker() (*list.Element, *worker) {
var next *list.Element
- for e := q.pending.Front(); e != nil; e = next {
- next = e.Next()
- task, _ := e.Value.(*model.Task)
+ var bestWorker *worker
+ var bestScore int
+
+ for element := q.pending.Front(); element != nil; element = next {
+ next = element.Next()
+ task, _ := element.Value.(*model.Task)
log.Debug().Msgf("queue: trying to assign task: %v with deps %v", task.ID, task.Dependencies)
- for w := range q.workers {
- if w.filter(task) {
- log.Debug().Msgf("queue: assigned task: %v with deps %v", task.ID, task.Dependencies)
- return e, w
+ for worker := range q.workers {
+ matched, score := worker.filter(task)
+ if matched && score > bestScore {
+ bestWorker = worker
+ bestScore = score
}
}
+ if bestWorker != nil {
+ log.Debug().Msgf("queue: assigned task: %v with deps %v to worker with score %d", task.ID, task.Dependencies, bestScore)
+ return element, bestWorker
+ }
}
return nil, nil
}
func (q *fifo) resubmitExpiredPipelines() {
- for id, state := range q.running {
- if time.Now().After(state.deadline) {
- q.pending.PushFront(state.item)
- delete(q.running, id)
- close(state.done)
+ for taskID, taskState := range q.running {
+ if time.Now().After(taskState.deadline) {
+ q.pending.PushFront(taskState.item)
+ delete(q.running, taskID)
+ close(taskState.done)
}
}
}
func (q *fifo) depsInQueue(task *model.Task) bool {
var next *list.Element
- for e := q.pending.Front(); e != nil; e = next {
- next = e.Next()
- possibleDep, ok := e.Value.(*model.Task)
+ for element := q.pending.Front(); element != nil; element = next {
+ next = element.Next()
+ possibleDep, ok := element.Value.(*model.Task)
log.Debug().Msgf("queue: pending right now: %v", possibleDep.ID)
for _, dep := range task.Dependencies {
if ok && possibleDep.ID == dep {
@@ -361,9 +386,9 @@ func (q *fifo) depsInQueue(task *model.Task) bool {
func (q *fifo) updateDepStatusInQueue(taskID string, status model.StatusValue) {
var next *list.Element
- for e := q.pending.Front(); e != nil; e = next {
- next = e.Next()
- pending, ok := e.Value.(*model.Task)
+ for element := q.pending.Front(); element != nil; element = next {
+ next = element.Next()
+ pending, ok := element.Value.(*model.Task)
for _, dep := range pending.Dependencies {
if ok && taskID == dep {
pending.DepStatus[dep] = status
@@ -379,9 +404,9 @@ func (q *fifo) updateDepStatusInQueue(taskID string, status model.StatusValue) {
}
}
- for e := q.waitingOnDeps.Front(); e != nil; e = next {
- next = e.Next()
- waiting, ok := e.Value.(*model.Task)
+ for element := q.waitingOnDeps.Front(); element != nil; element = next {
+ next = element.Next()
+ waiting, ok := element.Value.(*model.Task)
for _, dep := range waiting.Dependencies {
if ok && taskID == dep {
waiting.DepStatus[dep] = status
@@ -393,12 +418,12 @@ func (q *fifo) updateDepStatusInQueue(taskID string, status model.StatusValue) {
func (q *fifo) removeFromPending(taskID string) {
log.Debug().Msgf("queue: trying to remove %s", taskID)
var next *list.Element
- for e := q.pending.Front(); e != nil; e = next {
- next = e.Next()
- task, _ := e.Value.(*model.Task)
+ for element := q.pending.Front(); element != nil; element = next {
+ next = element.Next()
+ task, _ := element.Value.(*model.Task)
if task.ID == taskID {
log.Debug().Msgf("queue: %s is removed from pending", taskID)
- q.pending.Remove(e)
+ q.pending.Remove(element)
return
}
}
diff --git a/server/queue/fifo_test.go b/server/queue/fifo_test.go
index d1d3a2ebc..6c6d4252d 100644
--- a/server/queue/fifo_test.go
+++ b/server/queue/fifo_test.go
@@ -26,85 +26,95 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
-var noContext = context.Background()
+var filterFnTrue = func(*model.Task) (bool, int) { return true, 1 }
func TestFifo(t *testing.T) {
want := &model.Task{ID: "1"}
+ ctx := context.Background()
- q := New(context.Background())
- assert.NoError(t, q.Push(noContext, want))
- info := q.Info(noContext)
+ q := NewMemoryQueue(ctx)
+ assert.NoError(t, q.Push(ctx, want))
+ info := q.Info(ctx)
assert.Len(t, info.Pending, 1, "expect task in pending queue")
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, want, got)
- info = q.Info(noContext)
+ info = q.Info(ctx)
assert.Len(t, info.Pending, 0, "expect task removed from pending queue")
assert.Len(t, info.Running, 1, "expect task in running queue")
- assert.NoError(t, q.Done(noContext, got.ID, model.StatusSuccess))
- info = q.Info(noContext)
+ assert.NoError(t, q.Done(ctx, got.ID, model.StatusSuccess))
+ info = q.Info(ctx)
assert.Len(t, info.Pending, 0, "expect task removed from pending queue")
assert.Len(t, info.Running, 0, "expect task removed from running queue")
}
func TestFifoExpire(t *testing.T) {
want := &model.Task{ID: "1"}
+ ctx, cancel := context.WithCancelCause(context.Background())
- q, _ := New(context.Background()).(*fifo)
+ q, _ := NewMemoryQueue(ctx).(*fifo)
q.extension = 0
- assert.NoError(t, q.Push(noContext, want))
- info := q.Info(noContext)
+ assert.NoError(t, q.Push(ctx, want))
+ info := q.Info(ctx)
assert.Len(t, info.Pending, 1, "expect task in pending queue")
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, want, got)
+ // cancel the context to let the process func end
+ go func() {
+ time.Sleep(time.Millisecond)
+ cancel(nil)
+ }()
q.process()
assert.Len(t, info.Pending, 1, "expect task re-added to pending queue")
}
func TestFifoWait(t *testing.T) {
want := &model.Task{ID: "1"}
+ ctx := context.Background()
- q, _ := New(context.Background()).(*fifo)
- assert.NoError(t, q.Push(noContext, want))
+ q, _ := NewMemoryQueue(ctx).(*fifo)
+ assert.NoError(t, q.Push(ctx, want))
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, want, got)
var wg sync.WaitGroup
wg.Add(1)
go func() {
- assert.NoError(t, q.Wait(noContext, got.ID))
+ assert.NoError(t, q.Wait(ctx, got.ID))
wg.Done()
}()
<-time.After(time.Millisecond)
- assert.NoError(t, q.Done(noContext, got.ID, model.StatusSuccess))
+ assert.NoError(t, q.Done(ctx, got.ID, model.StatusSuccess))
wg.Wait()
}
func TestFifoEvict(t *testing.T) {
t1 := &model.Task{ID: "1"}
+ ctx := context.Background()
- q := New(context.Background())
- assert.NoError(t, q.Push(noContext, t1))
- info := q.Info(noContext)
+ q := NewMemoryQueue(ctx)
+ assert.NoError(t, q.Push(ctx, t1))
+ info := q.Info(ctx)
assert.Len(t, info.Pending, 1, "expect task in pending queue")
- err := q.Evict(noContext, t1.ID)
+ err := q.Evict(ctx, t1.ID)
assert.NoError(t, err)
- info = q.Info(noContext)
+ info = q.Info(ctx)
assert.Len(t, info.Pending, 0)
- err = q.Evict(noContext, t1.ID)
+ err = q.Evict(ctx, t1.ID)
assert.ErrorIs(t, err, ErrNotFound)
}
func TestFifoDependencies(t *testing.T) {
+ ctx := context.Background()
task1 := &model.Task{
ID: "1",
}
@@ -115,21 +125,22 @@ func TestFifoDependencies(t *testing.T) {
DepStatus: make(map[string]model.StatusValue),
}
- q, _ := New(context.Background()).(*fifo)
- assert.NoError(t, q.PushAtOnce(noContext, []*model.Task{task2, task1}))
+ q, _ := NewMemoryQueue(ctx).(*fifo)
+ assert.NoError(t, q.PushAtOnce(ctx, []*model.Task{task2, task1}))
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, task1, got)
- assert.NoError(t, q.Done(noContext, got.ID, model.StatusSuccess))
+ assert.NoError(t, q.Done(ctx, got.ID, model.StatusSuccess))
- got, err = q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err = q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, task2, got)
}
func TestFifoErrors(t *testing.T) {
+ ctx := context.Background()
task1 := &model.Task{
ID: "1",
}
@@ -147,27 +158,28 @@ func TestFifoErrors(t *testing.T) {
RunOn: []string{"success", "failure"},
}
- q, _ := New(context.Background()).(*fifo)
- assert.NoError(t, q.PushAtOnce(noContext, []*model.Task{task2, task3, task1}))
+ q, _ := NewMemoryQueue(ctx).(*fifo)
+ assert.NoError(t, q.PushAtOnce(ctx, []*model.Task{task2, task3, task1}))
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, task1, got)
- assert.NoError(t, q.Error(noContext, got.ID, fmt.Errorf("exit code 1, there was an error")))
+ assert.NoError(t, q.Error(ctx, got.ID, fmt.Errorf("exit code 1, there was an error")))
- got, err = q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err = q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, task2, got)
assert.False(t, got.ShouldRun())
- got, err = q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err = q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, task3, got)
assert.True(t, got.ShouldRun())
}
func TestFifoErrors2(t *testing.T) {
+ ctx := context.Background()
task1 := &model.Task{
ID: "1",
}
@@ -182,29 +194,30 @@ func TestFifoErrors2(t *testing.T) {
DepStatus: make(map[string]model.StatusValue),
}
- q, _ := New(context.Background()).(*fifo)
- assert.NoError(t, q.PushAtOnce(noContext, []*model.Task{task2, task3, task1}))
+ q, _ := NewMemoryQueue(ctx).(*fifo)
+ assert.NoError(t, q.PushAtOnce(ctx, []*model.Task{task2, task3, task1}))
for i := 0; i < 2; i++ {
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.False(t, got != task1 && got != task2, "expect task1 or task2 returned from queue as task3 depends on them")
if got != task1 {
- assert.NoError(t, q.Done(noContext, got.ID, model.StatusSuccess))
+ assert.NoError(t, q.Done(ctx, got.ID, model.StatusSuccess))
}
if got != task2 {
- assert.NoError(t, q.Error(noContext, got.ID, fmt.Errorf("exit code 1, there was an error")))
+ assert.NoError(t, q.Error(ctx, got.ID, fmt.Errorf("exit code 1, there was an error")))
}
}
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, task3, got)
assert.False(t, got.ShouldRun())
}
func TestFifoErrorsMultiThread(t *testing.T) {
+ ctx := context.Background()
task1 := &model.Task{
ID: "1",
}
@@ -221,8 +234,8 @@ func TestFifoErrorsMultiThread(t *testing.T) {
DepStatus: make(map[string]model.StatusValue),
}
- q, _ := New(context.Background()).(*fifo)
- assert.NoError(t, q.PushAtOnce(noContext, []*model.Task{task2, task3, task1}))
+ q, _ := NewMemoryQueue(ctx).(*fifo)
+ assert.NoError(t, q.PushAtOnce(ctx, []*model.Task{task2, task3, task1}))
obtainedWorkCh := make(chan *model.Task)
@@ -230,7 +243,7 @@ func TestFifoErrorsMultiThread(t *testing.T) {
go func(i int) {
for {
fmt.Printf("Worker %d started\n", i)
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
obtainedWorkCh <- got
}
@@ -249,22 +262,22 @@ func TestFifoErrorsMultiThread(t *testing.T) {
case !task1Processed:
assert.Equal(t, task1, got)
task1Processed = true
- assert.NoError(t, q.Error(noContext, got.ID, fmt.Errorf("exit code 1, there was an error")))
+ assert.NoError(t, q.Error(ctx, got.ID, fmt.Errorf("exit code 1, there was an error")))
go func() {
for {
fmt.Printf("Worker spawned\n")
- got, _ := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, _ := q.Poll(ctx, 1, filterFnTrue)
obtainedWorkCh <- got
}
}()
case !task2Processed:
assert.Equal(t, task2, got)
task2Processed = true
- assert.NoError(t, q.Done(noContext, got.ID, model.StatusSuccess))
+ assert.NoError(t, q.Done(ctx, got.ID, model.StatusSuccess))
go func() {
for {
fmt.Printf("Worker spawned\n")
- got, _ := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, _ := q.Poll(ctx, 1, filterFnTrue)
obtainedWorkCh <- got
}
}()
@@ -275,7 +288,7 @@ func TestFifoErrorsMultiThread(t *testing.T) {
}
case <-time.After(5 * time.Second):
- info := q.Info(noContext)
+ info := q.Info(ctx)
fmt.Println(info.String())
t.Errorf("test timed out")
return
@@ -284,6 +297,7 @@ func TestFifoErrorsMultiThread(t *testing.T) {
}
func TestFifoTransitiveErrors(t *testing.T) {
+ ctx := context.Background()
task1 := &model.Task{
ID: "1",
}
@@ -300,27 +314,28 @@ func TestFifoTransitiveErrors(t *testing.T) {
DepStatus: make(map[string]model.StatusValue),
}
- q, _ := New(context.Background()).(*fifo)
- assert.NoError(t, q.PushAtOnce(noContext, []*model.Task{task2, task3, task1}))
+ q, _ := NewMemoryQueue(ctx).(*fifo)
+ assert.NoError(t, q.PushAtOnce(ctx, []*model.Task{task2, task3, task1}))
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, task1, got)
- assert.NoError(t, q.Error(noContext, got.ID, fmt.Errorf("exit code 1, there was an error")))
+ assert.NoError(t, q.Error(ctx, got.ID, fmt.Errorf("exit code 1, there was an error")))
- got, err = q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err = q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, task2, got)
assert.False(t, got.ShouldRun(), "expect task2 should not run, since task1 failed")
- assert.NoError(t, q.Done(noContext, got.ID, model.StatusSkipped))
+ assert.NoError(t, q.Done(ctx, got.ID, model.StatusSkipped))
- got, err = q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, err = q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.Equal(t, task3, got)
assert.False(t, got.ShouldRun(), "expect task3 should not run, task1 failed, thus task2 was skipped, task3 should be skipped too")
}
func TestFifoCancel(t *testing.T) {
+ ctx := context.Background()
task1 := &model.Task{
ID: "1",
}
@@ -338,34 +353,35 @@ func TestFifoCancel(t *testing.T) {
RunOn: []string{"success", "failure"},
}
- q, _ := New(context.Background()).(*fifo)
- assert.NoError(t, q.PushAtOnce(noContext, []*model.Task{task2, task3, task1}))
+ q, _ := NewMemoryQueue(ctx).(*fifo)
+ assert.NoError(t, q.PushAtOnce(ctx, []*model.Task{task2, task3, task1}))
- _, _ = q.Poll(noContext, 1, func(*model.Task) bool { return true })
- assert.NoError(t, q.Error(noContext, task1.ID, fmt.Errorf("canceled")))
- assert.NoError(t, q.Error(noContext, task2.ID, fmt.Errorf("canceled")))
- assert.NoError(t, q.Error(noContext, task3.ID, fmt.Errorf("canceled")))
+ _, _ = q.Poll(ctx, 1, filterFnTrue)
+ assert.NoError(t, q.Error(ctx, task1.ID, fmt.Errorf("canceled")))
+ assert.NoError(t, q.Error(ctx, task2.ID, fmt.Errorf("canceled")))
+ assert.NoError(t, q.Error(ctx, task3.ID, fmt.Errorf("canceled")))
- info := q.Info(noContext)
+ info := q.Info(ctx)
assert.Len(t, info.Pending, 0, "all pipelines should be canceled")
}
func TestFifoPause(t *testing.T) {
+ ctx := context.Background()
task1 := &model.Task{
ID: "1",
}
- q, _ := New(context.Background()).(*fifo)
+ q, _ := NewMemoryQueue(ctx).(*fifo)
var wg sync.WaitGroup
wg.Add(1)
go func() {
- _, _ = q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ _, _ = q.Poll(ctx, 1, filterFnTrue)
wg.Done()
}()
q.Pause()
t0 := time.Now()
- assert.NoError(t, q.Push(noContext, task1))
+ assert.NoError(t, q.Push(ctx, task1))
time.Sleep(20 * time.Millisecond)
q.Resume()
@@ -375,25 +391,27 @@ func TestFifoPause(t *testing.T) {
assert.Greater(t, t1.Sub(t0), 20*time.Millisecond, "should have waited til resume")
q.Pause()
- assert.NoError(t, q.Push(noContext, task1))
+ assert.NoError(t, q.Push(ctx, task1))
q.Resume()
- _, _ = q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ _, _ = q.Poll(ctx, 1, filterFnTrue)
}
func TestFifoPauseResume(t *testing.T) {
+ ctx := context.Background()
task1 := &model.Task{
ID: "1",
}
- q, _ := New(context.Background()).(*fifo)
+ q, _ := NewMemoryQueue(ctx).(*fifo)
q.Pause()
- assert.NoError(t, q.Push(noContext, task1))
+ assert.NoError(t, q.Push(ctx, task1))
q.Resume()
- _, _ = q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ _, _ = q.Poll(ctx, 1, filterFnTrue)
}
func TestWaitingVsPending(t *testing.T) {
+ ctx := context.Background()
task1 := &model.Task{
ID: "1",
}
@@ -411,20 +429,20 @@ func TestWaitingVsPending(t *testing.T) {
RunOn: []string{"success", "failure"},
}
- q, _ := New(context.Background()).(*fifo)
- assert.NoError(t, q.PushAtOnce(noContext, []*model.Task{task2, task3, task1}))
+ q, _ := NewMemoryQueue(ctx).(*fifo)
+ assert.NoError(t, q.PushAtOnce(ctx, []*model.Task{task2, task3, task1}))
- got, _ := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ got, _ := q.Poll(ctx, 1, filterFnTrue)
- info := q.Info(noContext)
+ info := q.Info(ctx)
assert.Equal(t, 2, info.Stats.WaitingOnDeps)
- assert.NoError(t, q.Error(noContext, got.ID, fmt.Errorf("exit code 1, there was an error")))
- got, err := q.Poll(noContext, 1, func(*model.Task) bool { return true })
+ assert.NoError(t, q.Error(ctx, got.ID, fmt.Errorf("exit code 1, there was an error")))
+ got, err := q.Poll(ctx, 1, filterFnTrue)
assert.NoError(t, err)
assert.EqualValues(t, task2, got)
- info = q.Info(noContext)
+ info = q.Info(ctx)
assert.Equal(t, 0, info.Stats.WaitingOnDeps)
assert.Equal(t, 1, info.Stats.Pending)
}
@@ -498,3 +516,108 @@ func TestShouldRun(t *testing.T) {
}
assert.True(t, task.ShouldRun(), "on failure, tasks should run on skipped deps, something failed higher up the chain")
}
+
+func TestFifoWithScoring(t *testing.T) {
+ ctx := context.Background()
+ q := NewMemoryQueue(ctx)
+
+ // Create tasks with different labels
+ tasks := []*model.Task{
+ {ID: "1", Labels: map[string]string{"org-id": "123", "platform": "linux"}},
+ {ID: "2", Labels: map[string]string{"org-id": "456", "platform": "linux"}},
+ {ID: "3", Labels: map[string]string{"org-id": "789", "platform": "windows"}},
+ {ID: "4", Labels: map[string]string{"org-id": "123", "platform": "linux"}},
+ {ID: "5", Labels: map[string]string{"org-id": "*", "platform": "linux"}},
+ }
+
+ for _, task := range tasks {
+ assert.NoError(t, q.Push(ctx, task))
+ }
+
+ // Create filter functions for different workers
+ filters := map[int]FilterFn{
+ 1: func(task *model.Task) (bool, int) {
+ if task.Labels["org-id"] == "123" {
+ return true, 20
+ }
+ if task.Labels["platform"] == "linux" {
+ return true, 10
+ }
+ return true, 1
+ },
+ 2: func(task *model.Task) (bool, int) {
+ if task.Labels["org-id"] == "456" {
+ return true, 20
+ }
+ if task.Labels["platform"] == "linux" {
+ return true, 10
+ }
+ return true, 1
+ },
+ 3: func(task *model.Task) (bool, int) {
+ if task.Labels["platform"] == "windows" {
+ return true, 20
+ }
+ return true, 1
+ },
+ 4: func(task *model.Task) (bool, int) {
+ if task.Labels["org-id"] == "123" {
+ return true, 20
+ }
+ if task.Labels["platform"] == "linux" {
+ return true, 10
+ }
+ return true, 1
+ },
+ 5: func(task *model.Task) (bool, int) {
+ if task.Labels["org-id"] == "*" {
+ return true, 15
+ }
+ return true, 1
+ },
+ }
+
+ // Start polling in separate goroutines
+ results := make(chan *model.Task, 5)
+ for i := 1; i <= 5; i++ {
+ go func(n int) {
+ task, err := q.Poll(ctx, int64(n), filters[n])
+ assert.NoError(t, err)
+ results <- task
+ }(i)
+ }
+
+ // Collect results
+ receivedTasks := make(map[string]int64)
+ for i := 0; i < 5; i++ {
+ select {
+ case task := <-results:
+ receivedTasks[task.ID] = task.AgentID
+ case <-time.After(time.Second):
+ t.Fatal("Timeout waiting for tasks")
+ }
+ }
+
+ assert.Len(t, receivedTasks, 5, "All tasks should be assigned")
+
+ // Define expected agent assignments
+ // Map structure: {taskID: []possible agentIDs}
+ // - taskID "1" and "4" can be assigned to agents 1 or 4 (org-id "123")
+ // - taskID "2" should be assigned to agent 2 (org-id "456")
+ // - taskID "3" should be assigned to agent 3 (platform "windows")
+ // - taskID "5" should be assigned to agent 5 (org-id "*")
+ expectedAssignments := map[string][]int64{
+ "1": {1, 4},
+ "2": {2},
+ "3": {3},
+ "4": {1, 4},
+ "5": {5},
+ }
+
+ // Check if tasks are assigned as expected
+ for taskID, expectedAgents := range expectedAssignments {
+ agentID, ok := receivedTasks[taskID]
+ assert.True(t, ok, "Task %s should be assigned", taskID)
+ assert.Contains(t, expectedAgents, agentID, "Task %s should be assigned to one of the expected agents", taskID)
+ }
+}
diff --git a/server/queue/queue.go b/server/queue/queue.go
index 9cb695c24..3301f7e95 100644
--- a/server/queue/queue.go
+++ b/server/queue/queue.go
@@ -17,9 +17,11 @@ package queue
import (
"context"
"errors"
+ "fmt"
"strings"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
+ "go.woodpecker-ci.org/woodpecker/v2/server/store"
)
var (
@@ -28,6 +30,9 @@ var (
// ErrNotFound indicates the task was not found in the queue.
ErrNotFound = errors.New("queue: task not found")
+
+ // ErrAgentMissMatch indicates a task is assigned to a different agent.
+ ErrAgentMissMatch = errors.New("task assigned to different agent")
)
// InfoT provides runtime information.
@@ -64,7 +69,8 @@ func (t *InfoT) String() string {
// Filter filters tasks in the queue. If the Filter returns false,
// the Task is skipped and not returned to the subscriber.
-type FilterFn func(*model.Task) bool
+// The int return value represents the matching score (higher is better).
+type FilterFn func(*model.Task) (bool, int)
// Queue defines a task queue for scheduling tasks among
// a pool of workers.
@@ -79,7 +85,7 @@ type Queue interface {
Poll(c context.Context, agentID int64, f FilterFn) (*model.Task, error)
// Extend extends the deadline for a task.
- Extend(c context.Context, id string) error
+ Extend(c context.Context, agentID int64, workflowID string) error
// Done signals the task is complete.
Done(c context.Context, id string, exitStatus model.StatusValue) error
@@ -111,3 +117,33 @@ type Queue interface {
// KickAgentWorkers kicks all workers for a given agent.
KickAgentWorkers(agentID int64)
}
+
+// Config holds the configuration for the queue.
+type Config struct {
+ Backend Type
+ Store store.Store
+}
+
+// Queue type.
+type Type string
+
+const (
+ TypeMemory Type = "memory"
+)
+
+// New creates a new queue based on the provided configuration.
+func New(ctx context.Context, config Config) (Queue, error) {
+ var q Queue
+
+ switch config.Backend {
+ case TypeMemory:
+ q = NewMemoryQueue(ctx)
+ if config.Store != nil {
+ q = WithTaskStore(ctx, q, config.Store)
+ }
+ default:
+ return nil, fmt.Errorf("unsupported queue backend: %s", config.Backend)
+ }
+
+ return q, nil
+}
diff --git a/server/router/api.go b/server/router/api.go
index 3fb760760..2a514904d 100644
--- a/server/router/api.go
+++ b/server/router/api.go
@@ -52,13 +52,15 @@ func apiRoutes(e *gin.RouterGroup) {
orgs.GET("/lookup/*org_full_name", api.LookupOrg)
orgBase := orgs.Group("/:org_id")
{
+ orgBase.Use(session.SetOrg())
+ orgBase.Use(session.MustOrg())
orgBase.GET("/permissions", api.GetOrgPermissions)
+ orgBase.GET("", session.MustOrgMember(false), api.GetOrg)
org := orgBase.Group("")
{
org.Use(session.MustOrgMember(true))
org.DELETE("", session.MustAdmin(), api.DeleteOrg)
- org.GET("", api.GetOrg)
org.GET("/secrets", api.GetOrgSecretList)
org.POST("/secrets", api.PostOrgSecret)
@@ -71,6 +73,11 @@ func apiRoutes(e *gin.RouterGroup) {
org.GET("/registries/:registry", api.GetOrgRegistry)
org.PATCH("/registries/:registry", api.PatchOrgRegistry)
org.DELETE("/registries/:registry", api.DeleteOrgRegistry)
+
+ org.GET("/agents", api.GetOrgAgents)
+ org.POST("/agents", api.PostOrgAgent)
+ org.PATCH("/agents/:agent_id", api.PatchOrgAgent)
+ org.DELETE("/agents/:agent_id", api.DeleteOrgAgent)
}
}
}
@@ -102,6 +109,7 @@ func apiRoutes(e *gin.RouterGroup) {
repo.DELETE("/pipelines/:number", session.MustRepoAdmin(), api.DeletePipeline)
repo.GET("/pipelines/:number", api.GetPipeline)
repo.GET("/pipelines/:number/config", api.GetPipelineConfig)
+ repo.GET("/pipelines/:number/metadata", session.MustPush, api.GetPipelineMetadata)
// requires push permissions
repo.POST("/pipelines/:number", session.MustPush, api.PostPipeline)
@@ -129,13 +137,6 @@ func apiRoutes(e *gin.RouterGroup) {
repo.PATCH("/registries/:registry", session.MustPush, api.PatchRegistry)
repo.DELETE("/registries/:registry", session.MustPush, api.DeleteRegistry)
- // TODO: remove with 3.x
- repo.GET("/registry", session.MustPush, api.GetRegistryList)
- repo.POST("/registry", session.MustPush, api.PostRegistry)
- repo.GET("/registry/:registry", session.MustPush, api.GetRegistry)
- repo.PATCH("/registry/:registry", session.MustPush, api.PatchRegistry)
- repo.DELETE("/registry/:registry", session.MustPush, api.DeleteRegistry)
-
// requires push permissions
repo.GET("/cron", session.MustPush, api.GetCronList)
repo.POST("/cron", session.MustPush, api.PostCron)
@@ -223,10 +224,10 @@ func apiRoutes(e *gin.RouterGroup) {
agentBase.Use(session.MustAdmin())
agentBase.GET("", api.GetAgents)
agentBase.POST("", api.PostAgent)
- agentBase.GET("/:agent", api.GetAgent)
- agentBase.GET("/:agent/tasks", api.GetAgentTasks)
- agentBase.PATCH("/:agent", api.PatchAgent)
- agentBase.DELETE("/:agent", api.DeleteAgent)
+ agentBase.GET("/:agent_id", api.GetAgent)
+ agentBase.GET("/:agent_id/tasks", api.GetAgentTasks)
+ agentBase.PATCH("/:agent_id", api.PatchAgent)
+ agentBase.DELETE("/:agent_id", api.DeleteAgent)
}
apiBase.GET("/forges", api.GetForges)
diff --git a/server/router/middleware/session/org.go b/server/router/middleware/session/org.go
new file mode 100644
index 000000000..0ce2af2ab
--- /dev/null
+++ b/server/router/middleware/session/org.go
@@ -0,0 +1,86 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package session
+
+import (
+ "errors"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+
+ "go.woodpecker-ci.org/woodpecker/v2/server/model"
+ "go.woodpecker-ci.org/woodpecker/v2/server/store"
+ "go.woodpecker-ci.org/woodpecker/v2/server/store/types"
+)
+
+func Org(c *gin.Context) *model.Org {
+ v, ok := c.Get("org")
+ if !ok {
+ return nil
+ }
+ r, ok := v.(*model.Org)
+ if !ok {
+ return nil
+ }
+ return r
+}
+
+func SetOrg() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ var (
+ orgID int64
+ err error
+ )
+
+ orgParam := c.Param("org_id")
+ if orgParam != "" {
+ orgID, err = strconv.ParseInt(orgParam, 10, 64)
+ if err != nil {
+ c.String(http.StatusBadRequest, "Invalid organization ID")
+ c.Abort()
+ return
+ }
+ }
+
+ org, err := store.FromContext(c).OrgGet(orgID)
+ if err != nil && !errors.Is(err, types.RecordNotExist) {
+ _ = c.AbortWithError(http.StatusInternalServerError, err)
+ return
+ }
+
+ if org == nil {
+ c.String(http.StatusNotFound, "Organization not found")
+ c.Abort()
+ return
+ }
+
+ c.Set("org", org)
+ c.Next()
+ }
+}
+
+func MustOrg() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ org := Org(c)
+ switch {
+ case org == nil:
+ c.String(http.StatusNotFound, "Organization not loaded")
+ c.Abort()
+ default:
+ c.Next()
+ }
+ }
+}
diff --git a/server/router/middleware/session/user.go b/server/router/middleware/session/user.go
index 2f098b5cb..862d82df6 100644
--- a/server/router/middleware/session/user.go
+++ b/server/router/middleware/session/user.go
@@ -122,8 +122,6 @@ func MustUser() gin.HandlerFunc {
func MustOrgMember(admin bool) gin.HandlerFunc {
return func(c *gin.Context) {
- _store := store.FromContext(c)
-
user := User(c)
if user == nil {
c.String(http.StatusUnauthorized, "User not authorized")
@@ -131,15 +129,10 @@ func MustOrgMember(admin bool) gin.HandlerFunc {
return
}
- orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64)
- if err != nil {
- c.String(http.StatusBadRequest, "Error parsing org id. %s", err)
- return
- }
-
- org, err := _store.OrgGet(orgID)
- if err != nil {
- c.String(http.StatusNotFound, "Organization not found")
+ org := Org(c)
+ if org == nil {
+ c.String(http.StatusBadRequest, "Organization not loaded")
+ c.Abort()
return
}
diff --git a/server/router/router.go b/server/router/router.go
index 89e1046f9..c873062d3 100644
--- a/server/router/router.go
+++ b/server/router/router.go
@@ -62,7 +62,6 @@ func Load(noRouteHandler http.HandlerFunc, middleware ...gin.HandlerFunc) http.H
{
auth.GET("", api.HandleAuth)
auth.POST("", api.HandleAuth)
- auth.POST("/token", api.DeprecatedGetLoginToken)
}
base.GET("/metrics", metrics.PromHandler())
diff --git a/server/services/config/combined_test.go b/server/services/config/combined_test.go
index d2a767cac..70c2f407e 100644
--- a/server/services/config/combined_test.go
+++ b/server/services/config/combined_test.go
@@ -27,9 +27,9 @@ import (
"testing"
"time"
- "github.com/go-ap/httpsig"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
+ "github.com/yaronf/httpsign"
"go.woodpecker-ci.org/woodpecker/v2/server/forge/mocks"
forge_types "go.woodpecker-ci.org/woodpecker/v2/server/forge/types"
@@ -120,25 +120,19 @@ func TestFetchFromConfigService(t *testing.T) {
fixtureHandler := func(w http.ResponseWriter, r *http.Request) {
// check signature
- pubKeyID := "woodpecker-ci-plugins"
+ pubKeyID := "woodpecker-ci-extensions"
- keystore := httpsig.NewMemoryKeyStore()
- keystore.SetKey(pubKeyID, pubEd25519Key)
+ verifier, err := httpsign.NewEd25519Verifier(pubEd25519Key,
+ httpsign.NewVerifyConfig(),
+ httpsign.Headers("@request-target", "content-digest")) // The Content-Digest header will be auto-generated
+ assert.NoError(t, err)
- verifier := httpsig.NewVerifier(keystore)
- verifier.SetRequiredHeaders([]string{"(request-target)", "date"})
-
- keyID, err := verifier.Verify(r)
+ err = httpsign.VerifyRequest(pubKeyID, *verifier, r)
if err != nil {
http.Error(w, "Invalid signature", http.StatusBadRequest)
return
}
- if keyID != pubKeyID {
- http.Error(w, "Used wrong key", http.StatusBadRequest)
- return
- }
-
type config struct {
Name string `json:"name"`
Data string `json:"data"`
@@ -163,12 +157,12 @@ func TestFetchFromConfigService(t *testing.T) {
}
if req.Repo.Name == "Fetch empty" {
- w.WriteHeader(404)
+ w.WriteHeader(http.StatusNotFound)
return
}
if req.Repo.Name == "Use old config" {
- w.WriteHeader(204)
+ w.WriteHeader(http.StatusNoContent)
return
}
@@ -192,7 +186,7 @@ func TestFetchFromConfigService(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(fixtureHandler))
defer ts.Close()
- httpFetcher := config.NewHTTP(ts.URL, privEd25519Key)
+ httpFetcher := config.NewHTTP(ts.URL+"/", privEd25519Key)
for _, tt := range testTable {
t.Run(tt.name, func(t *testing.T) {
diff --git a/server/services/config/forge.go b/server/services/config/forge.go
index c88a30ca6..ce59076ca 100644
--- a/server/services/config/forge.go
+++ b/server/services/config/forge.go
@@ -59,10 +59,9 @@ func (f *forgeFetcher) Fetch(ctx context.Context, forge forge.Forge, user *model
for i := 0; i < int(f.retryCount); i++ {
files, err = ffc.fetch(ctx, strings.TrimSpace(repo.Config))
if err != nil {
- log.Trace().Err(err).Msgf("%d. try failed", i+1)
- }
- if errors.Is(err, context.DeadlineExceeded) {
- continue
+ log.Trace().Err(err).Msgf("Fetching config files: Attempt #%d failed", i+1)
+ } else {
+ break
}
}
@@ -143,11 +142,12 @@ func (f *forgeFetcherContext) getFirstAvailableConfig(c context.Context, configs
for _, fileOrFolder := range configs {
if strings.HasSuffix(fileOrFolder, "/") {
// config is a folder
+ log.Trace().Msgf("fetching %s from forge", fileOrFolder)
files, err := f.forge.Dir(c, f.user, f.repo, f.pipeline, strings.TrimSuffix(fileOrFolder, "/"))
// if folder is not supported we will get a "Not implemented" error and continue
if err != nil {
if !(errors.Is(err, types.ErrNotImplemented) || errors.Is(err, &types.ErrConfigNotFound{})) {
- log.Error().Err(err).Str("repo", f.repo.FullName).Str("user", f.user.Login).Msg("could not get folder from forge")
+ log.Error().Err(err).Str("repo", f.repo.FullName).Str("user", f.user.Login).Msgf("could not get folder from forge: %s", err)
forgeErr = append(forgeErr, err)
}
continue
diff --git a/server/services/config/forge_test.go b/server/services/config/forge_test.go
index 6a8651203..05869f24a 100644
--- a/server/services/config/forge_test.go
+++ b/server/services/config/forge_test.go
@@ -287,7 +287,7 @@ func TestFetch(t *testing.T) {
f := new(mocks.Forge)
dirs := map[string][]*forge_types.FileMeta{}
for _, file := range tt.files {
- f.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, file.name).Return(file.data, nil)
+ f.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, file.name).Once().Return(file.data, nil)
path := filepath.Dir(file.name)
if path != "." {
dirs[path] = append(dirs[path], &forge_types.FileMeta{
@@ -298,7 +298,7 @@ func TestFetch(t *testing.T) {
}
for path, files := range dirs {
- f.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, path).Return(files, nil)
+ f.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, path).Once().Return(files, nil)
}
// if the previous mocks do not match return not found errors
diff --git a/server/services/config/http.go b/server/services/config/http.go
index de3a0844a..33dcfc756 100644
--- a/server/services/config/http.go
+++ b/server/services/config/http.go
@@ -16,7 +16,7 @@ package config
import (
"context"
- "crypto"
+ "crypto/ed25519"
"fmt"
net_http "net/http"
@@ -28,7 +28,7 @@ import (
type http struct {
endpoint string
- privateKey crypto.PrivateKey
+ privateKey ed25519.PrivateKey
}
// configData same as forge.FileMeta but with json tags and string data.
@@ -38,26 +38,20 @@ type configData struct {
}
type requestStructure struct {
- Repo *model.Repo `json:"repo"`
- Pipeline *model.Pipeline `json:"pipeline"`
- Netrc *model.Netrc `json:"netrc"`
- Configuration []*configData `json:"configs"` // TODO: deprecate in favor of netrc and remove in next major release
+ Repo *model.Repo `json:"repo"`
+ Pipeline *model.Pipeline `json:"pipeline"`
+ Netrc *model.Netrc `json:"netrc"`
}
type responseStructure struct {
Configs []*configData `json:"configs"`
}
-func NewHTTP(endpoint string, privateKey crypto.PrivateKey) Service {
+func NewHTTP(endpoint string, privateKey ed25519.PrivateKey) Service {
return &http{endpoint, privateKey}
}
func (h *http) Fetch(ctx context.Context, forge forge.Forge, user *model.User, repo *model.Repo, pipeline *model.Pipeline, oldConfigData []*types.FileMeta, _ bool) ([]*types.FileMeta, error) {
- currentConfigs := make([]*configData, len(oldConfigData))
- for i, pipe := range oldConfigData {
- currentConfigs[i] = &configData{Name: pipe.Name, Data: string(pipe.Data)}
- }
-
netrc, err := forge.Netrc(user, repo)
if err != nil {
return nil, fmt.Errorf("could not get Netrc data from forge: %w", err)
@@ -65,10 +59,9 @@ func (h *http) Fetch(ctx context.Context, forge forge.Forge, user *model.User, r
response := new(responseStructure)
body := requestStructure{
- Repo: repo,
- Pipeline: pipeline,
- Configuration: currentConfigs,
- Netrc: netrc,
+ Repo: repo,
+ Pipeline: pipeline,
+ Netrc: netrc,
}
status, err := utils.Send(ctx, net_http.MethodPost, h.endpoint, h.privateKey, body, response)
diff --git a/server/services/log/file/file.go b/server/services/log/file/file.go
index 276c31798..f19931beb 100644
--- a/server/services/log/file/file.go
+++ b/server/services/log/file/file.go
@@ -8,10 +8,18 @@ import (
"path/filepath"
"strings"
+ logger "github.com/rs/zerolog/log"
+
+ "go.woodpecker-ci.org/woodpecker/v2/pipeline"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
"go.woodpecker-ci.org/woodpecker/v2/server/services/log"
)
+const (
+ // Add base64 overhead and space for other JSON fields (just to be safe).
+ maxLineLength int = (pipeline.MaxLogLineLength/3)*4 + (64 * 1024) //nolint:mnd
+)
+
type logStore struct {
base string
}
@@ -43,7 +51,10 @@ func (l logStore) LogFind(step *model.Step) ([]*model.LogEntry, error) {
return nil, err
}
+ buf := make([]byte, 0, bufio.MaxScanTokenSize)
s := bufio.NewScanner(file)
+ s.Buffer(buf, maxLineLength)
+
var entries []*model.LogEntry
for s.Scan() {
j := s.Text()
@@ -61,19 +72,30 @@ func (l logStore) LogFind(step *model.Step) ([]*model.LogEntry, error) {
return entries, nil
}
-func (l logStore) LogAppend(logEntry *model.LogEntry) error {
- file, err := os.OpenFile(l.filePath(logEntry.StepID), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600)
+func (l logStore) LogAppend(step *model.Step, logEntries []*model.LogEntry) error {
+ path := l.filePath(step.ID)
+
+ file, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600)
if err != nil {
+ logger.Error().Err(err).Msgf("could not open log file %s", path)
return err
}
- jsonData, err := json.Marshal(logEntry)
- if err != nil {
- return err
+
+ var bytes []byte
+
+ for _, logEntry := range logEntries {
+ if jsonLine, err := json.Marshal(logEntry); err == nil {
+ bytes = append(bytes, jsonLine...)
+ bytes = append(bytes, byte('\n'))
+ } else {
+ logger.Error().Err(err).Msg("could not convert log entry to JSON")
+ }
}
- _, err = file.Write(append(jsonData, byte('\n')))
- if err != nil {
- return err
+
+ if _, err = file.Write(bytes); err != nil {
+ logger.Error().Err(err).Msg("could not write out log entries")
}
+
return file.Close()
}
diff --git a/server/services/log/service.go b/server/services/log/service.go
index 5cc53d1e9..da8f98146 100644
--- a/server/services/log/service.go
+++ b/server/services/log/service.go
@@ -4,6 +4,6 @@ import "go.woodpecker-ci.org/woodpecker/v2/server/model"
type Service interface {
LogFind(step *model.Step) ([]*model.LogEntry, error)
- LogAppend(logEntry *model.LogEntry) error
+ LogAppend(step *model.Step, logEntries []*model.LogEntry) error
LogDelete(step *model.Step) error
}
diff --git a/server/services/setup.go b/server/services/setup.go
index 8260159ae..751a30ddd 100644
--- a/server/services/setup.go
+++ b/server/services/setup.go
@@ -57,7 +57,7 @@ func setupSecretService(store store.Store) secret.Service {
return secret.NewDB(store)
}
-func setupConfigService(c *cli.Command, privateSignatureKey crypto.PrivateKey) (config.Service, error) {
+func setupConfigService(c *cli.Command, privateSignatureKey ed25519.PrivateKey) (config.Service, error) {
timeout := c.Duration("forge-timeout")
retries := c.Uint("forge-retry")
if retries == 0 {
@@ -74,7 +74,7 @@ func setupConfigService(c *cli.Command, privateSignatureKey crypto.PrivateKey) (
}
// setupSignatureKeys generate or load key pair to sign webhooks requests (i.e. used for service extensions).
-func setupSignatureKeys(_store store.Store) (crypto.PrivateKey, crypto.PublicKey, error) {
+func setupSignatureKeys(_store store.Store) (ed25519.PrivateKey, crypto.PublicKey, error) {
privKeyID := "signature-private-key"
privKey, err := _store.ServerConfigGet(privKeyID)
diff --git a/server/services/utils/http.go b/server/services/utils/http.go
index c11bfe27f..40a50269c 100644
--- a/server/services/utils/http.go
+++ b/server/services/utils/http.go
@@ -17,19 +17,19 @@ package utils
import (
"bytes"
"context"
- "crypto"
+ "crypto/ed25519"
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
- "github.com/go-ap/httpsig"
+ "github.com/yaronf/httpsign"
)
// Send makes an http request to the given endpoint, writing the input
// to the request body and un-marshaling the output from the response body.
-func Send(ctx context.Context, method, path string, privateKey crypto.PrivateKey, in, out any) (int, error) {
+func Send(ctx context.Context, method, path string, privateKey ed25519.PrivateKey, in, out any) (int, error) {
uri, err := url.Parse(path)
if err != nil {
return 0, err
@@ -54,12 +54,12 @@ func Send(ctx context.Context, method, path string, privateKey crypto.PrivateKey
req.Header.Set("Content-Type", "application/json")
}
- err = SignHTTPRequest(privateKey, req)
+ client, err := signClient(privateKey)
if err != nil {
return 0, err
}
- resp, err := http.DefaultClient.Do(req)
+ resp, err := client.Do(req)
if err != nil {
return 0, err
}
@@ -79,10 +79,14 @@ func Send(ctx context.Context, method, path string, privateKey crypto.PrivateKey
return resp.StatusCode, err
}
-func SignHTTPRequest(privateKey crypto.PrivateKey, req *http.Request) error {
- pubKeyID := "woodpecker-ci-plugins"
+func signClient(privateKey ed25519.PrivateKey) (*httpsign.Client, error) {
+ pubKeyID := "woodpecker-ci-extensions"
- signer := httpsig.NewEd25519Signer(pubKeyID, privateKey, nil)
-
- return signer.Sign(req)
+ signer, err := httpsign.NewEd25519Signer(privateKey,
+ httpsign.NewSignConfig(),
+ httpsign.Headers("@request-target", "content-digest")) // The Content-Digest header will be auto-generated
+ if err != nil {
+ return nil, err
+ }
+ return httpsign.NewDefaultClient(httpsign.NewClientConfig().SetSignatureName(pubKeyID).SetSigner(signer)), nil // sign requests, don't verify responses
}
diff --git a/server/services/utils/http_test.go b/server/services/utils/http_test.go
index 3b47e8cc7..57d7eece2 100644
--- a/server/services/utils/http_test.go
+++ b/server/services/utils/http_test.go
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package utils_test
+package utils
import (
"bytes"
@@ -21,15 +21,14 @@ import (
"net/http"
"net/http/httptest"
"testing"
+ "time"
- "github.com/go-ap/httpsig"
"github.com/stretchr/testify/assert"
-
- "go.woodpecker-ci.org/woodpecker/v2/server/services/utils"
+ "github.com/yaronf/httpsign"
)
-func TestSign(t *testing.T) {
- pubKeyID := "woodpecker-ci-plugins"
+func TestSignClient(t *testing.T) {
+ pubKeyID := "woodpecker-ci-extensions"
pubEd25519Key, privEd25519Key, err := ed25519.GenerateKey(rand.Reader)
if !assert.NoError(t, err) {
@@ -38,36 +37,36 @@ func TestSign(t *testing.T) {
body := []byte("{\"foo\":\"bar\"}")
- req, err := http.NewRequest(http.MethodGet, "http://example.com", bytes.NewBuffer(body))
- if err != nil {
- t.Fatal(err)
- }
-
- req.Header.Set("Content-Type", "application/json")
-
- err = utils.SignHTTPRequest(privEd25519Key, req)
- if err != nil {
- t.Fatal(err)
- }
-
verifyHandler := func(w http.ResponseWriter, r *http.Request) {
- keystore := httpsig.NewMemoryKeyStore()
- keystore.SetKey(pubKeyID, pubEd25519Key)
-
- verifier := httpsig.NewVerifier(keystore)
- verifier.SetRequiredHeaders([]string{"(request-target)", "date"})
-
- keyID, err := verifier.Verify(r)
+ verifier, err := httpsign.NewEd25519Verifier(pubEd25519Key,
+ httpsign.NewVerifyConfig(),
+ httpsign.Headers("@request-target", "content-digest")) // The Content-Digest header will be auto-generated
+ assert.NoError(t, err)
+
+ err = httpsign.VerifyRequest(pubKeyID, *verifier, r)
assert.NoError(t, err)
- assert.Equal(t, pubKeyID, keyID)
w.WriteHeader(http.StatusOK)
}
- rr := httptest.NewRecorder()
- handler := http.HandlerFunc(verifyHandler)
+ server := httptest.NewServer(http.HandlerFunc(verifyHandler))
- handler.ServeHTTP(rr, req)
+ req, err := http.NewRequest("GET", server.URL+"/", bytes.NewBuffer(body))
+ if !assert.NoError(t, err) {
+ return
+ }
- assert.Equal(t, http.StatusOK, rr.Code)
+ req.Header.Set("Date", time.Now().Format(time.RFC3339))
+ req.Header.Set("Content-Type", "application/json")
+
+ client, err := signClient(privEd25519Key)
+ if !assert.NoError(t, err) {
+ return
+ }
+
+ rr, err := client.Do(req)
+ assert.NoError(t, err)
+ defer rr.Body.Close()
+
+ assert.Equal(t, http.StatusOK, rr.StatusCode)
}
diff --git a/server/store/common.go b/server/store/common.go
index 4a051d838..025cf82cc 100644
--- a/server/store/common.go
+++ b/server/store/common.go
@@ -14,9 +14,14 @@
package store
+import "time"
+
type XORM struct {
- Log bool
- ShowSQL bool
+ Log bool
+ ShowSQL bool
+ MaxIdleConns int
+ MaxOpenConns int
+ ConnMaxLifetime time.Duration
}
// Opts are options for a new database connection.
diff --git a/server/store/datastore/agent.go b/server/store/datastore/agent.go
index 383692289..18e035e76 100644
--- a/server/store/datastore/agent.go
+++ b/server/store/datastore/agent.go
@@ -22,8 +22,7 @@ import (
var ErrNoTokenProvided = errors.New("please provide a token")
-func (s storage) AgentList(p *model.ListOptions) ([]*model.Agent, error) {
- var agents []*model.Agent
+func (s storage) AgentList(p *model.ListOptions) (agents []*model.Agent, _ error) {
return agents, s.paginate(p).OrderBy("id").Find(&agents)
}
@@ -55,3 +54,7 @@ func (s storage) AgentUpdate(agent *model.Agent) error {
func (s storage) AgentDelete(agent *model.Agent) error {
return wrapDelete(s.engine.ID(agent.ID).Delete(new(model.Agent)))
}
+
+func (s storage) AgentListForOrg(orgID int64, p *model.ListOptions) (agents []*model.Agent, _ error) {
+ return agents, s.paginate(p).Where("org_id = ?", orgID).OrderBy("id").Find(&agents)
+}
diff --git a/server/store/datastore/agent_test.go b/server/store/datastore/agent_test.go
index f08a5ee74..c94d46719 100644
--- a/server/store/datastore/agent_test.go
+++ b/server/store/datastore/agent_test.go
@@ -65,14 +65,12 @@ func TestAgentList(t *testing.T) {
defer closer()
agent1 := &model.Agent{
- ID: int64(1),
- Name: "test-1",
- Token: "secret-token-1",
+ ID: int64(1),
+ Name: "test-1",
}
agent2 := &model.Agent{
- ID: int64(2),
- Name: "test-2",
- Token: "secret-token-2",
+ ID: int64(2),
+ Name: "test-2",
}
err := store.AgentCreate(agent1)
assert.NoError(t, err)
@@ -106,3 +104,43 @@ func TestAgentUpdate(t *testing.T) {
err = store.AgentUpdate(agent)
assert.NoError(t, err)
}
+
+func TestAgentListForOrg(t *testing.T) {
+ store, closer := newTestStore(t, new(model.Agent))
+ defer closer()
+
+ agent1 := &model.Agent{
+ ID: int64(1),
+ Name: "test-1",
+ OrgID: int64(100),
+ }
+ agent2 := &model.Agent{
+ ID: int64(2),
+ Name: "test-2",
+ OrgID: int64(100),
+ }
+ agent3 := &model.Agent{
+ ID: int64(3),
+ Name: "test-3",
+ OrgID: int64(200),
+ }
+ assert.NoError(t, store.AgentCreate(agent1))
+ assert.NoError(t, store.AgentCreate(agent2))
+ assert.NoError(t, store.AgentCreate(agent3))
+
+ agents, err := store.AgentListForOrg(100, &model.ListOptions{All: true})
+ assert.NoError(t, err)
+ assert.Equal(t, 2, len(agents))
+ assert.Equal(t, "test-1", agents[0].Name)
+ assert.Equal(t, "test-2", agents[1].Name)
+
+ agents, err = store.AgentListForOrg(200, &model.ListOptions{All: true})
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(agents))
+ assert.Equal(t, "test-3", agents[0].Name)
+
+ agents, err = store.AgentListForOrg(100, &model.ListOptions{Page: 1, PerPage: 1})
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(agents))
+ assert.Equal(t, "test-1", agents[0].Name)
+}
diff --git a/server/store/datastore/engine.go b/server/store/datastore/engine.go
index 8499681ac..316347591 100644
--- a/server/store/datastore/engine.go
+++ b/server/store/datastore/engine.go
@@ -45,6 +45,9 @@ func NewEngine(opts *store.Opts) (store.Store, error) {
logger := newXORMLogger(level)
engine.SetLogger(logger)
engine.ShowSQL(opts.XORM.ShowSQL)
+ engine.SetMaxOpenConns(opts.XORM.MaxOpenConns)
+ engine.SetMaxIdleConns(opts.XORM.MaxIdleConns)
+ engine.SetConnMaxLifetime(opts.XORM.ConnMaxLifetime)
return &storage{
engine: engine,
diff --git a/server/store/datastore/log.go b/server/store/datastore/log.go
index 68c708c63..3aedf4650 100644
--- a/server/store/datastore/log.go
+++ b/server/store/datastore/log.go
@@ -15,16 +15,33 @@
package datastore
import (
+ "github.com/rs/zerolog/log"
+
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
+// Maximum number of records to store in one PostgreSQL statement.
+// Too large a value results in `pq: got XX parameters but PostgreSQL only supports 65535 parameters`.
+const pgBatchSize = 1000
+
func (s storage) LogFind(step *model.Step) ([]*model.LogEntry, error) {
var logEntries []*model.LogEntry
return logEntries, s.engine.Asc("id").Where("step_id = ?", step.ID).Find(&logEntries)
}
-func (s storage) LogAppend(logEntry *model.LogEntry) error {
- _, err := s.engine.Insert(logEntry)
+func (s storage) LogAppend(_ *model.Step, logEntries []*model.LogEntry) error {
+ var err error
+
+ // TODO: adapted from slices.Chunk(); switch to it in Go 1.23+
+ for i := 0; i < len(logEntries); i += pgBatchSize {
+ end := min(pgBatchSize, len(logEntries[i:]))
+ chunk := logEntries[i : i+end]
+
+ if _, err = s.engine.Insert(chunk); err != nil {
+ log.Error().Err(err).Msg("could not store log entries to db")
+ }
+ }
+
return err
}
diff --git a/server/store/datastore/log_test.go b/server/store/datastore/log_test.go
index f2ee1ffc6..94897268c 100644
--- a/server/store/datastore/log_test.go
+++ b/server/store/datastore/log_test.go
@@ -45,9 +45,7 @@ func TestLogCreateFindDelete(t *testing.T) {
},
}
- for _, logEntry := range logEntries {
- assert.NoError(t, store.LogAppend(logEntry))
- }
+ assert.NoError(t, store.LogAppend(&step, logEntries))
// we want to find our inserted logs
_logEntries, err := store.LogFind(&step)
@@ -83,9 +81,7 @@ func TestLogAppend(t *testing.T) {
},
}
- for _, logEntry := range logEntries {
- assert.NoError(t, store.LogAppend(logEntry))
- }
+ assert.NoError(t, store.LogAppend(&step, logEntries))
logEntry := &model.LogEntry{
StepID: step.ID,
@@ -94,7 +90,7 @@ func TestLogAppend(t *testing.T) {
Time: 20,
}
- assert.NoError(t, store.LogAppend(logEntry))
+ assert.NoError(t, store.LogAppend(&step, []*model.LogEntry{logEntry}))
_logEntries, err := store.LogFind(&step)
assert.NoError(t, err)
diff --git a/server/store/datastore/migration/023_add_org_id.go b/server/store/datastore/migration/001_add_org_id.go
similarity index 95%
rename from server/store/datastore/migration/023_add_org_id.go
rename to server/store/datastore/migration/001_add_org_id.go
index 37d59833a..877ab58cd 100644
--- a/server/store/datastore/migration/023_add_org_id.go
+++ b/server/store/datastore/migration/001_add_org_id.go
@@ -26,12 +26,12 @@ import (
var addOrgID = xormigrate.Migration{
ID: "add-org-id",
MigrateSession: func(sess *xorm.Session) error {
- if err := sess.Sync(new(userV031)); err != nil {
+ if err := sess.Sync(new(userV009)); err != nil {
return fmt.Errorf("sync new models failed: %w", err)
}
// get all users
- var users []*userV031
+ var users []*userV009
if err := sess.Find(&users); err != nil {
return fmt.Errorf("find all repos failed: %w", err)
}
diff --git a/server/store/datastore/migration/001_legacy_to_xorm.go b/server/store/datastore/migration/001_legacy_to_xorm.go
deleted file mode 100644
index 47a526147..000000000
--- a/server/store/datastore/migration/001_legacy_to_xorm.go
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2021 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "fmt"
-
- "github.com/rs/zerolog/log"
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
- "xorm.io/xorm/schemas"
-)
-
-var legacy2Xorm = xormigrate.Migration{
- ID: "xorm",
- MigrateSession: func(sess *xorm.Session) error {
- // make sure we have required migrations - else fail and point to last major version
- for _, mig := range []string{
- // users
- "create-table-users",
- "update-table-set-users-token-and-secret-length",
- // repos
- "create-table-repos",
- "alter-table-add-repo-visibility",
- "update-table-set-repo-visibility",
- "alter-table-add-repo-seq",
- "update-table-set-repo-seq",
- "update-table-set-repo-seq-default",
- "alter-table-add-repo-active",
- "update-table-set-repo-active",
- "alter-table-add-repo-fallback", // needed to drop col
- // builds
- "create-table-builds",
- "create-index-builds-repo",
- "create-index-builds-author",
- // procs
- "create-table-procs",
- "create-index-procs-build",
- // files
- "create-table-files",
- "create-index-files-builds",
- "create-index-files-procs",
- "alter-table-add-file-pid",
- "alter-table-add-file-meta-passed",
- "alter-table-add-file-meta-failed",
- "alter-table-add-file-meta-skipped",
- "alter-table-update-file-meta",
- // secrets
- "create-table-secrets",
- "create-index-secrets-repo",
- // registry
- "create-table-registry",
- "create-index-registry-repo",
- // senders
- "create-table-senders",
- "create-index-sender-repos",
- // perms
- "create-table-perms",
- "create-index-perms-repo",
- "create-index-perms-user",
- // build_config
- "create-table-build-config",
- "populate-build-config",
- } {
- exist, err := sess.Exist(&xormigrate.Migration{ID: mig})
- if err != nil {
- return fmt.Errorf("test migration existence: %w", err)
- }
- if !exist {
- log.Error().Msgf("migration step '%s' missing, please upgrade to last stable v0.14.x version first", mig)
- return fmt.Errorf("legacy migration step missing")
- }
- }
-
- { // recreate build_config
- type BuildConfig struct {
- ConfigID int64 `xorm:"NOT NULL 'config_id'"` // xorm.Sync() do not use index info of sess -> so it tries to create it twice
- BuildID int64 `xorm:"NOT NULL 'build_id'"`
- }
- if err := renameTable(sess, "build_config", "old_build_config"); err != nil {
- return err
- }
- if err := sess.Sync(new(BuildConfig)); err != nil {
- return err
- }
- if _, err := sess.Exec("INSERT INTO build_config (config_id, build_id) SELECT config_id,build_id FROM old_build_config;"); err != nil {
- return fmt.Errorf("unable to set copy data into temp table %s. Error: %w", "old_build_config", err)
- }
- if err := sess.DropTable("old_build_config"); err != nil {
- return fmt.Errorf("could not drop table '%s': %w", "old_build_config", err)
- }
- }
-
- dialect := sess.Engine().Dialect().URI().DBType
- switch dialect {
- case schemas.MYSQL:
- for _, exec := range []string{
- "DROP INDEX IF EXISTS build_number ON builds;",
- "DROP INDEX IF EXISTS ix_build_repo ON builds;",
- "DROP INDEX IF EXISTS ix_build_author ON builds;",
- "DROP INDEX IF EXISTS proc_build_ix ON procs;",
- "DROP INDEX IF EXISTS file_build_ix ON files;",
- "DROP INDEX IF EXISTS file_proc_ix ON files;",
- "DROP INDEX IF EXISTS ix_secrets_repo ON secrets;",
- "DROP INDEX IF EXISTS ix_registry_repo ON registry;",
- "DROP INDEX IF EXISTS sender_repo_ix ON senders;",
- "DROP INDEX IF EXISTS ix_perms_repo ON perms;",
- "DROP INDEX IF EXISTS ix_perms_user ON perms;",
- } {
- if _, err := sess.Exec(exec); err != nil {
- return fmt.Errorf("exec: '%s' failed: %w", exec, err)
- }
- }
- case schemas.SQLITE, schemas.POSTGRES:
- for _, exec := range []string{
- "DROP INDEX IF EXISTS ix_build_status_running;",
- "DROP INDEX IF EXISTS ix_build_repo;",
- "DROP INDEX IF EXISTS ix_build_author;",
- "DROP INDEX IF EXISTS proc_build_ix;",
- "DROP INDEX IF EXISTS file_build_ix;",
- "DROP INDEX IF EXISTS file_proc_ix;",
- "DROP INDEX IF EXISTS ix_secrets_repo;",
- "DROP INDEX IF EXISTS ix_registry_repo;",
- "DROP INDEX IF EXISTS sender_repo_ix;",
- "DROP INDEX IF EXISTS ix_perms_repo;",
- "DROP INDEX IF EXISTS ix_perms_user;",
- } {
- if _, err := sess.Exec(exec); err != nil {
- return fmt.Errorf("exec: '%s' failed: %w", exec, err)
- }
- }
- default:
- return fmt.Errorf("dialect '%s' not supported", dialect)
- }
-
- return nil
- },
-}
diff --git a/server/store/datastore/migration/002_repos_drop_fallback.go b/server/store/datastore/migration/002_repos_drop_fallback.go
deleted file mode 100644
index 111bd3eb0..000000000
--- a/server/store/datastore/migration/002_repos_drop_fallback.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2021 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var alterTableReposDropFallback = xormigrate.Migration{
- ID: "alter-table-drop-repo-fallback",
- MigrateSession: func(sess *xorm.Session) error {
- return dropTableColumns(sess, "repos", "repo_fallback")
- },
-}
diff --git a/server/store/datastore/migration/024_task_data_type.go b/server/store/datastore/migration/002_task_data_type.go
similarity index 100%
rename from server/store/datastore/migration/024_task_data_type.go
rename to server/store/datastore/migration/002_task_data_type.go
diff --git a/server/store/datastore/migration/025_config_data_type.go b/server/store/datastore/migration/003_config_data_type.go
similarity index 100%
rename from server/store/datastore/migration/025_config_data_type.go
rename to server/store/datastore/migration/003_config_data_type.go
diff --git a/server/store/datastore/migration/003_repos_drop_allow_deploys_allow_tags.go b/server/store/datastore/migration/003_repos_drop_allow_deploys_allow_tags.go
deleted file mode 100644
index d99610f56..000000000
--- a/server/store/datastore/migration/003_repos_drop_allow_deploys_allow_tags.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2021 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var alterTableReposDropAllowDeploysAllowTags = xormigrate.Migration{
- ID: "drop-allow-push-tags-deploys-columns",
- MigrateSession: func(sess *xorm.Session) error {
- return dropTableColumns(sess, "repos",
- "repo_allow_deploys",
- "repo_allow_tags",
- )
- },
-}
diff --git a/server/store/datastore/migration/004_fix_pr_secret_event_name.go b/server/store/datastore/migration/004_fix_pr_secret_event_name.go
deleted file mode 100644
index 66406a07b..000000000
--- a/server/store/datastore/migration/004_fix_pr_secret_event_name.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2021 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-
- "go.woodpecker-ci.org/woodpecker/v2/server/model"
-)
-
-var fixPRSecretEventName = xormigrate.Migration{
- ID: "fix-pr-secret-event-name",
- MigrateSession: func(sess *xorm.Session) error {
- const batchSize = 100
- for start := 0; ; start += batchSize {
- secrets := make([]*model.Secret, 0, batchSize)
- if err := sess.Limit(batchSize, start).Table("secrets").Cols("secret_id", "secret_events").Where("secret_events LIKE '%pull-request%'").Find(&secrets); err != nil {
- return err
- }
-
- if len(secrets) == 0 {
- break
- }
-
- for _, secret := range secrets {
- for i, event := range secret.Events {
- if event == "pull-request" {
- secret.Events[i] = "pull_request"
- }
- }
- if _, err := sess.ID(secret.ID).Cols("secret_events").Update(secret); err != nil {
- return err
- }
- }
- }
- return nil
- },
-}
diff --git a/server/store/datastore/migration/026_remove_secrets_plugin_only_col.go b/server/store/datastore/migration/004_remove_secrets_plugin_only_col.go
similarity index 92%
rename from server/store/datastore/migration/026_remove_secrets_plugin_only_col.go
rename to server/store/datastore/migration/004_remove_secrets_plugin_only_col.go
index 082744cca..8a91ffb36 100644
--- a/server/store/datastore/migration/026_remove_secrets_plugin_only_col.go
+++ b/server/store/datastore/migration/004_remove_secrets_plugin_only_col.go
@@ -19,7 +19,7 @@ import (
"xorm.io/xorm"
)
-type oldSecret026 struct {
+type oldSecret004 struct {
ID int64 `json:"id" xorm:"pk autoincr 'secret_id'"`
PluginsOnly bool `json:"plugins_only" xorm:"secret_plugins_only"`
SkipVerify bool `json:"-" xorm:"secret_skip_verify"`
@@ -27,7 +27,7 @@ type oldSecret026 struct {
Images []string `json:"images" xorm:"json 'secret_images'"`
}
-func (oldSecret026) TableName() string {
+func (oldSecret004) TableName() string {
return "secrets"
}
@@ -35,7 +35,7 @@ var removePluginOnlyOptionFromSecretsTable = xormigrate.Migration{
ID: "remove-plugin-only-option-from-secrets-table",
MigrateSession: func(sess *xorm.Session) (err error) {
// make sure plugin_only column exists
- if err := sess.Sync(new(oldSecret026)); err != nil {
+ if err := sess.Sync(new(oldSecret004)); err != nil {
return err
}
diff --git a/server/store/datastore/migration/027_convert_to_new_pipeline_errors_format.go b/server/store/datastore/migration/005_convert_to_new_pipeline_errors_format.go
similarity index 83%
rename from server/store/datastore/migration/027_convert_to_new_pipeline_errors_format.go
rename to server/store/datastore/migration/005_convert_to_new_pipeline_errors_format.go
index a51ac1c6a..53d18c8fd 100644
--- a/server/store/datastore/migration/027_convert_to_new_pipeline_errors_format.go
+++ b/server/store/datastore/migration/005_convert_to_new_pipeline_errors_format.go
@@ -21,20 +21,20 @@ import (
errorTypes "go.woodpecker-ci.org/woodpecker/v2/pipeline/errors/types"
)
-// perPage027 set the size of the slice to read per page.
-var perPage027 = 100
+// perPage005 set the size of the slice to read per page.
+var perPage005 = 100
-type pipeline027 struct {
+type pipeline005 struct {
ID int64 `json:"id" xorm:"pk autoincr 'pipeline_id'"`
Error string `json:"error" xorm:"LONGTEXT 'pipeline_error'"` // old error format
Errors []*errorTypes.PipelineError `json:"errors" xorm:"json 'pipeline_errors'"` // new error format
}
-func (pipeline027) TableName() string {
+func (pipeline005) TableName() string {
return "pipelines"
}
-type PipelineError027 struct {
+type PipelineError005 struct {
Type string `json:"type"`
Message string `json:"message"`
IsWarning bool `json:"is_warning"`
@@ -46,23 +46,23 @@ var convertToNewPipelineErrorFormat = xormigrate.Migration{
Long: true,
MigrateSession: func(sess *xorm.Session) (err error) {
// make sure pipeline_error column exists
- if err := sess.Sync(new(pipeline027)); err != nil {
+ if err := sess.Sync(new(pipeline005)); err != nil {
return err
}
page := 0
- oldPipelines := make([]*pipeline027, 0, perPage027)
+ oldPipelines := make([]*pipeline005, 0, perPage005)
for {
oldPipelines = oldPipelines[:0]
- err := sess.Limit(perPage027, page*perPage027).Cols("pipeline_id", "pipeline_error").Where("pipeline_error != ''").Find(&oldPipelines)
+ err := sess.Limit(perPage005, page*perPage005).Cols("pipeline_id", "pipeline_error").Where("pipeline_error != ''").Find(&oldPipelines)
if err != nil {
return err
}
for _, oldPipeline := range oldPipelines {
- var newPipeline pipeline027
+ var newPipeline pipeline005
newPipeline.ID = oldPipeline.ID
newPipeline.Errors = []*errorTypes.PipelineError{{
Type: "generic",
@@ -74,7 +74,7 @@ var convertToNewPipelineErrorFormat = xormigrate.Migration{
}
}
- if len(oldPipelines) < perPage027 {
+ if len(oldPipelines) < perPage005 {
break
}
diff --git a/server/store/datastore/migration/005_repos_drop_repo_counter.go b/server/store/datastore/migration/005_repos_drop_repo_counter.go
deleted file mode 100644
index dc1785e0c..000000000
--- a/server/store/datastore/migration/005_repos_drop_repo_counter.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2021 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var alterTableReposDropCounter = xormigrate.Migration{
- ID: "alter-table-drop-counter",
- MigrateSession: func(sess *xorm.Session) error {
- return dropTableColumns(sess, "repos", "repo_counter")
- },
-}
diff --git a/server/store/datastore/migration/006_drop_senders.go b/server/store/datastore/migration/006_drop_senders.go
deleted file mode 100644
index f547bda09..000000000
--- a/server/store/datastore/migration/006_drop_senders.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var dropSenders = xormigrate.Migration{
- ID: "drop-senders",
- MigrateSession: func(sess *xorm.Session) error {
- return sess.DropTable("senders")
- },
-}
diff --git a/server/store/datastore/migration/028_link_to_url.go b/server/store/datastore/migration/006_link_to_url.go
similarity index 100%
rename from server/store/datastore/migration/028_link_to_url.go
rename to server/store/datastore/migration/006_link_to_url.go
diff --git a/server/store/datastore/migration/029_clean_registry_pipeline.go b/server/store/datastore/migration/007_clean_registry_pipeline.go
similarity index 89%
rename from server/store/datastore/migration/029_clean_registry_pipeline.go
rename to server/store/datastore/migration/007_clean_registry_pipeline.go
index 21eb4277b..a0b5dba87 100644
--- a/server/store/datastore/migration/029_clean_registry_pipeline.go
+++ b/server/store/datastore/migration/007_clean_registry_pipeline.go
@@ -19,17 +19,17 @@ import (
"xorm.io/xorm"
)
-type oldRegistry029 struct {
+type oldRegistry007 struct {
ID int64 `json:"id" xorm:"pk autoincr 'registry_id'"`
Token string `json:"token" xorm:"TEXT 'registry_token'"`
Email string `json:"email" xorm:"varchar(500) 'registry_email'"`
}
-func (oldRegistry029) TableName() string {
+func (oldRegistry007) TableName() string {
return "registry"
}
-type oldPipeline029 struct {
+type oldPipeline007 struct {
ID int64 `json:"id" xorm:"pk autoincr 'pipeline_id'"`
ConfigID int64 `json:"-" xorm:"pipeline_config_id"`
Enqueued int64 `json:"enqueued_at" xorm:"pipeline_enqueued"`
@@ -37,14 +37,14 @@ type oldPipeline029 struct {
}
// TableName return database table name for xorm.
-func (oldPipeline029) TableName() string {
+func (oldPipeline007) TableName() string {
return "pipelines"
}
var cleanRegistryPipeline = xormigrate.Migration{
ID: "clean-registry-pipeline",
MigrateSession: func(sess *xorm.Session) (err error) {
- if err := sess.Sync(new(oldRegistry029), new(oldPipeline029)); err != nil {
+ if err := sess.Sync(new(oldRegistry007), new(oldPipeline007)); err != nil {
return err
}
diff --git a/server/store/datastore/migration/008_secrets_add_user.go b/server/store/datastore/migration/008_secrets_add_user.go
deleted file mode 100644
index 6755a3b62..000000000
--- a/server/store/datastore/migration/008_secrets_add_user.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-type SecretV008 struct {
- Owner string `json:"-" xorm:"NOT NULL DEFAULT '' UNIQUE(s) INDEX 'secret_owner'"`
- RepoID int64 `json:"-" xorm:"NOT NULL DEFAULT 0 UNIQUE(s) INDEX 'secret_repo_id'"`
- Name string `json:"name" xorm:"NOT NULL UNIQUE(s) INDEX 'secret_name'"`
-}
-
-// TableName return database table name for xorm.
-func (SecretV008) TableName() string {
- return "secrets"
-}
-
-var alterTableSecretsAddUserCol = xormigrate.Migration{
- ID: "alter-table-add-secrets-user-id",
- MigrateSession: func(sess *xorm.Session) error {
- if err := sess.Sync(new(SecretV008)); err != nil {
- return err
- }
- if err := alterColumnDefault(sess, "secrets", "secret_repo_id", "0"); err != nil {
- return err
- }
- if err := alterColumnNull(sess, "secrets", "secret_repo_id", false); err != nil {
- return err
- }
- return alterColumnNull(sess, "secrets", "secret_name", false)
- },
-}
diff --git a/server/store/datastore/migration/030_set_default_forge_id.go b/server/store/datastore/migration/008_set_default_forge_id.go
similarity index 93%
rename from server/store/datastore/migration/030_set_default_forge_id.go
rename to server/store/datastore/migration/008_set_default_forge_id.go
index bbd9300c3..4edc817f9 100644
--- a/server/store/datastore/migration/030_set_default_forge_id.go
+++ b/server/store/datastore/migration/008_set_default_forge_id.go
@@ -23,7 +23,7 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
-type userV030 struct {
+type userV008 struct {
ID int64 `xorm:"pk autoincr 'user_id'"`
ForgeID int64 `xorm:"forge_id"`
ForgeRemoteID model.ForgeRemoteID `xorm:"forge_remote_id"`
@@ -38,11 +38,11 @@ type userV030 struct {
OrgID int64 `xorm:"user_org_id"`
}
-func (userV030) TableName() string {
+func (userV008) TableName() string {
return "users"
}
-type repoV030 struct {
+type repoV008 struct {
ID int64 `xorm:"pk autoincr 'repo_id'"`
UserID int64 `xorm:"repo_user_id"`
ForgeID int64 `xorm:"forge_id"`
@@ -73,11 +73,11 @@ type repoV030 struct {
NetrcOnlyTrusted bool `xorm:"NOT NULL DEFAULT true 'netrc_only_trusted'"`
}
-func (repoV030) TableName() string {
+func (repoV008) TableName() string {
return "repos"
}
-type forgeV030 struct {
+type forgeV008 struct {
ID int64 `xorm:"pk autoincr 'id'"`
Type model.ForgeType `xorm:"VARCHAR(250) 'type'"`
URL string `xorm:"VARCHAR(500) 'url'"`
@@ -88,18 +88,18 @@ type forgeV030 struct {
AdditionalOptions map[string]any `xorm:"json 'additional_options'"`
}
-func (forgeV030) TableName() string {
+func (forgeV008) TableName() string {
return "forge"
}
var setForgeID = xormigrate.Migration{
ID: "set-forge-id",
MigrateSession: func(sess *xorm.Session) (err error) {
- if err := sess.Sync(new(userV030), new(repoV030), new(forgeV030), new(model.Org)); err != nil {
+ if err := sess.Sync(new(userV008), new(repoV008), new(forgeV008), new(model.Org)); err != nil {
return fmt.Errorf("sync new models failed: %w", err)
}
- _, err = sess.Exec(fmt.Sprintf("UPDATE `%s` SET forge_id=1;", userV030{}.TableName()))
+ _, err = sess.Exec(fmt.Sprintf("UPDATE `%s` SET forge_id=1;", userV008{}.TableName()))
if err != nil {
return err
}
@@ -109,7 +109,7 @@ var setForgeID = xormigrate.Migration{
return err
}
- _, err = sess.Exec(fmt.Sprintf("UPDATE `%s` SET forge_id=1;", repoV030{}.TableName()))
+ _, err = sess.Exec(fmt.Sprintf("UPDATE `%s` SET forge_id=1;", repoV008{}.TableName()))
return err
},
}
diff --git a/server/store/datastore/migration/031_unify_columns_tables.go b/server/store/datastore/migration/009_unify_columns_tables.go
similarity index 94%
rename from server/store/datastore/migration/031_unify_columns_tables.go
rename to server/store/datastore/migration/009_unify_columns_tables.go
index 881832b0f..db8578b2f 100644
--- a/server/store/datastore/migration/031_unify_columns_tables.go
+++ b/server/store/datastore/migration/009_unify_columns_tables.go
@@ -24,7 +24,7 @@ import (
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
-type configV031 struct {
+type configV009 struct {
ID int64 `xorm:"pk autoincr 'config_id'"`
RepoID int64 `xorm:"UNIQUE(s) 'config_repo_id'"`
Hash string `xorm:"UNIQUE(s) 'config_hash'"`
@@ -32,11 +32,11 @@ type configV031 struct {
Data []byte `xorm:"LONGBLOB 'config_data'"`
}
-func (configV031) TableName() string {
+func (configV009) TableName() string {
return "config"
}
-type cronV031 struct {
+type cronV009 struct {
ID int64 `xorm:"pk autoincr 'i_d'"`
Name string `xorm:"name UNIQUE(s) INDEX"`
RepoID int64 `xorm:"repo_id UNIQUE(s) INDEX"`
@@ -47,11 +47,11 @@ type cronV031 struct {
Branch string `xorm:"branch"`
}
-func (cronV031) TableName() string {
+func (cronV009) TableName() string {
return "crons"
}
-type permV031 struct {
+type permV009 struct {
UserID int64 `xorm:"UNIQUE(s) INDEX NOT NULL 'perm_user_id'"`
RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL 'perm_repo_id'"`
Pull bool `xorm:"perm_pull"`
@@ -60,11 +60,11 @@ type permV031 struct {
Synced int64 `xorm:"perm_synced"`
}
-func (permV031) TableName() string {
+func (permV009) TableName() string {
return "perms"
}
-type pipelineV031 struct {
+type pipelineV009 struct {
ID int64 `xorm:"pk autoincr 'pipeline_id'"`
RepoID int64 `xorm:"UNIQUE(s) INDEX 'pipeline_repo_id'"`
Number int64 `xorm:"UNIQUE(s) 'pipeline_number'"`
@@ -93,19 +93,19 @@ type pipelineV031 struct {
Reviewed int64 `xorm:"pipeline_reviewed"`
}
-func (pipelineV031) TableName() string {
+func (pipelineV009) TableName() string {
return "pipelines"
}
-type redirectionV031 struct {
+type redirectionV009 struct {
ID int64 `xorm:"pk autoincr 'redirection_id'"`
}
-func (r redirectionV031) TableName() string {
+func (r redirectionV009) TableName() string {
return "redirections"
}
-type registryV031 struct {
+type registryV009 struct {
ID int64 `xorm:"pk autoincr 'registry_id'"`
RepoID int64 `xorm:"UNIQUE(s) INDEX 'registry_repo_id'"`
Address string `xorm:"UNIQUE(s) INDEX 'registry_addr'"`
@@ -113,7 +113,11 @@ type registryV031 struct {
Password string `xorm:"TEXT 'registry_password'"`
}
-type repoV031 struct {
+func (registryV009) TableName() string {
+ return "registry"
+}
+
+type repoV009 struct {
ID int64 `xorm:"pk autoincr 'repo_id'"`
UserID int64 `xorm:"repo_user_id"`
OrgID int64 `xorm:"repo_org_id"`
@@ -139,11 +143,11 @@ type repoV031 struct {
Hash string `xorm:"varchar(500) 'repo_hash'"`
}
-func (repoV031) TableName() string {
+func (repoV009) TableName() string {
return "repos"
}
-type secretV031 struct {
+type secretV009 struct {
ID int64 `xorm:"pk autoincr 'secret_id'"`
OrgID int64 `xorm:"NOT NULL DEFAULT 0 UNIQUE(s) INDEX 'secret_org_id'"`
RepoID int64 `xorm:"NOT NULL DEFAULT 0 UNIQUE(s) INDEX 'secret_repo_id'"`
@@ -153,11 +157,11 @@ type secretV031 struct {
Events []model.WebhookEvent `xorm:"json 'secret_events'"`
}
-func (secretV031) TableName() string {
+func (secretV009) TableName() string {
return "secrets"
}
-type stepV031 struct {
+type stepV009 struct {
ID int64 `xorm:"pk autoincr 'step_id'"`
UUID string `xorm:"INDEX 'step_uuid'"`
PipelineID int64 `xorm:"UNIQUE(s) INDEX 'step_pipeline_id'"`
@@ -173,11 +177,11 @@ type stepV031 struct {
Type model.StepType `xorm:"step_type"`
}
-func (stepV031) TableName() string {
+func (stepV009) TableName() string {
return "steps"
}
-type taskV031 struct {
+type taskV009 struct {
ID string `xorm:"PK UNIQUE 'task_id'"`
Data []byte `xorm:"LONGBLOB 'task_data'"`
Labels map[string]string `xorm:"json 'task_labels'"`
@@ -186,11 +190,11 @@ type taskV031 struct {
DepStatus map[string]model.StatusValue `xorm:"json 'task_dep_status'"`
}
-func (taskV031) TableName() string {
+func (taskV009) TableName() string {
return "tasks"
}
-type userV031 struct {
+type userV009 struct {
ID int64 `xorm:"pk autoincr 'user_id'"`
Login string `xorm:"UNIQUE 'user_login'"`
Token string `xorm:"TEXT 'user_token'"`
@@ -203,11 +207,11 @@ type userV031 struct {
OrgID int64 `xorm:"user_org_id"`
}
-func (userV031) TableName() string {
+func (userV009) TableName() string {
return "users"
}
-type workflowV031 struct {
+type workflowV009 struct {
ID int64 `xorm:"pk autoincr 'workflow_id'"`
PipelineID int64 `xorm:"UNIQUE(s) INDEX 'workflow_pipeline_id'"`
PID int `xorm:"UNIQUE(s) 'workflow_pid'"`
@@ -222,23 +226,23 @@ type workflowV031 struct {
AxisID int `xorm:"workflow_axis_id"`
}
-func (workflowV031) TableName() string {
+func (workflowV009) TableName() string {
return "workflows"
}
-type serverConfigV031 struct {
+type serverConfigV009 struct {
Key string `xorm:"pk 'key'"`
Value string `xorm:"value"`
}
-func (serverConfigV031) TableName() string {
+func (serverConfigV009) TableName() string {
return "server_config"
}
var unifyColumnsTables = xormigrate.Migration{
ID: "unify-columns-tables",
MigrateSession: func(sess *xorm.Session) (err error) {
- if err := sess.Sync(new(configV031), new(cronV031), new(permV031), new(pipelineV031), new(redirectionV031), new(registryV031), new(repoV031), new(secretV031), new(stepV031), new(taskV031), new(userV031), new(workflowV031), new(serverConfigV031)); err != nil {
+ if err := sess.Sync(new(configV009), new(cronV009), new(permV009), new(pipelineV009), new(redirectionV009), new(registryV009), new(repoV009), new(secretV009), new(stepV009), new(taskV009), new(userV009), new(workflowV009), new(serverConfigV009)); err != nil {
return fmt.Errorf("sync models failed: %w", err)
}
diff --git a/server/store/datastore/migration/032_registries_add_user.go b/server/store/datastore/migration/010_registries_add_user.go
similarity index 100%
rename from server/store/datastore/migration/032_registries_add_user.go
rename to server/store/datastore/migration/010_registries_add_user.go
diff --git a/server/store/datastore/migration/010_rename_builds_to_pipeline.go b/server/store/datastore/migration/010_rename_builds_to_pipeline.go
deleted file mode 100644
index 9fd042425..000000000
--- a/server/store/datastore/migration/010_rename_builds_to_pipeline.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var renameBuildsToPipeline = xormigrate.Migration{
- ID: "rename-builds-to-pipeline",
- MigrateSession: func(sess *xorm.Session) error {
- err := renameTable(sess, "builds", "pipelines")
- if err != nil {
- return err
- }
- err = renameTable(sess, "build_config", "pipeline_config")
- if err != nil {
- return err
- }
- return nil
- },
-}
diff --git a/server/store/datastore/migration/011_columns_rename_builds_to_pipeline.go b/server/store/datastore/migration/011_columns_rename_builds_to_pipeline.go
deleted file mode 100644
index b80a465e5..000000000
--- a/server/store/datastore/migration/011_columns_rename_builds_to_pipeline.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "strings"
-
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-type oldTable struct {
- table string
- columns []string
-}
-
-var renameColumnsBuildsToPipeline = xormigrate.Migration{
- ID: "rename-columns-builds-to-pipeline",
- MigrateSession: func(sess *xorm.Session) error {
- var oldColumns []*oldTable
-
- oldColumns = append(oldColumns, &oldTable{
- table: "pipelines",
- columns: []string{
- "build_id",
- "build_repo_id",
- "build_number",
- "build_author",
- "build_config_id",
- "build_parent",
- "build_event",
- "build_status",
- "build_error",
- "build_enqueued",
- "build_created",
- "build_started",
- "build_finished",
- "build_deploy",
- "build_commit",
- "build_branch",
- "build_ref",
- "build_refspec",
- "build_remote",
- "build_title",
- "build_message",
- "build_timestamp",
- "build_sender",
- "build_avatar",
- "build_email",
- "build_link",
- "build_signed",
- "build_verified",
- "build_reviewer",
- "build_reviewed",
- },
- },
- )
-
- oldColumns = append(oldColumns, &oldTable{
- table: "pipeline_config",
- columns: []string{"build_id"},
- })
-
- oldColumns = append(oldColumns, &oldTable{
- table: "files",
- columns: []string{"file_build_id"},
- })
-
- oldColumns = append(oldColumns, &oldTable{
- table: "procs",
- columns: []string{"proc_build_id"},
- })
-
- for _, table := range oldColumns {
- for _, column := range table.columns {
- err := renameColumn(sess, table.table, column, strings.Replace(column, "build_", "pipeline_", 1))
- if err != nil {
- return err
- }
- }
- }
-
- return nil
- },
-}
diff --git a/server/store/datastore/migration/009_recreate_agents_table.go b/server/store/datastore/migration/011_cron_without_sec.go
similarity index 51%
rename from server/store/datastore/migration/009_recreate_agents_table.go
rename to server/store/datastore/migration/011_cron_without_sec.go
index b0a8d1f60..12e5b257f 100644
--- a/server/store/datastore/migration/009_recreate_agents_table.go
+++ b/server/store/datastore/migration/011_cron_without_sec.go
@@ -1,10 +1,10 @@
-// Copyright 2022 Woodpecker Authors
+// Copyright 2024 Woodpecker Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,18 +15,40 @@
package migration
import (
+ "fmt"
+ "strings"
+
"src.techknowlogick.com/xormigrate"
"xorm.io/xorm"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
-var recreateAgentsTable = xormigrate.Migration{
- ID: "recreate-agents-table",
+var cronWithoutSec = xormigrate.Migration{
+ ID: "cron-without-sec",
MigrateSession: func(sess *xorm.Session) error {
- if err := sess.DropTable("agents"); err != nil {
+ if err := sess.Sync(new(model.Cron)); err != nil {
+ return fmt.Errorf("sync new models failed: %w", err)
+ }
+
+ var crons []*model.Cron
+ if err := sess.Find(&crons); err != nil {
return err
}
- return sess.Sync(new(model.Agent))
+
+ for _, c := range crons {
+ if strings.HasPrefix(strings.TrimSpace(c.Schedule), "@") {
+ // something like "@daily"
+ continue
+ }
+
+ if _, err := sess.Update(&model.Cron{
+ Schedule: strings.SplitN(strings.TrimSpace(c.Schedule), " ", 2)[1],
+ }, c); err != nil {
+ return err
+ }
+ }
+
+ return nil
},
}
diff --git a/server/store/datastore/migration/012_columns_rename_procs_to_steps.go b/server/store/datastore/migration/012_columns_rename_procs_to_steps.go
deleted file mode 100644
index 015bdac4f..000000000
--- a/server/store/datastore/migration/012_columns_rename_procs_to_steps.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "strings"
-
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var renameTableProcsToSteps = xormigrate.Migration{
- ID: "rename-procs-to-steps",
- MigrateSession: func(sess *xorm.Session) error {
- err := renameTable(sess, "procs", "steps")
- if err != nil {
- return err
- }
-
- oldProcColumns := []*oldTable{
- {
- table: "steps",
- columns: []string{
- "proc_id",
- "proc_pipeline_id",
- "proc_pid",
- "proc_ppid",
- "proc_pgid",
- "proc_name",
- "proc_state",
- "proc_error",
- "proc_exit_code",
- "proc_started",
- "proc_stopped",
- "proc_machine",
- "proc_platform",
- "proc_environ",
- },
- },
- {
- table: "files",
- columns: []string{"file_proc_id"},
- },
- }
-
- for _, table := range oldProcColumns {
- for _, column := range table.columns {
- err := renameColumn(sess, table.table, column, strings.Replace(column, "proc_", "step_", 1))
- if err != nil {
- return err
- }
- }
- }
-
- oldJobColumns := []*oldTable{
- {
- table: "logs",
- columns: []string{
- "log_job_id",
- },
- },
- }
-
- for _, table := range oldJobColumns {
- for _, column := range table.columns {
- err := renameColumn(sess, table.table, column, strings.Replace(column, "job_", "step_", 1))
- if err != nil {
- return err
- }
- }
- }
-
- return nil
- },
-}
diff --git a/server/store/datastore/migration/012_rename_start_end_time.go b/server/store/datastore/migration/012_rename_start_end_time.go
new file mode 100644
index 000000000..e710c7f0a
--- /dev/null
+++ b/server/store/datastore/migration/012_rename_start_end_time.go
@@ -0,0 +1,59 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package migration
+
+import (
+ "fmt"
+
+ "src.techknowlogick.com/xormigrate"
+ "xorm.io/xorm"
+)
+
+type stepV012 struct {
+ Finished int64 `xorm:"stopped"`
+}
+
+func (stepV012) TableName() string {
+ return "steps"
+}
+
+type workflowV012 struct {
+ Finished int64 `xorm:"stopped"`
+}
+
+func (workflowV012) TableName() string {
+ return "workflows"
+}
+
+var renameStartEndTime = xormigrate.Migration{
+ ID: "rename-start-end-time",
+ MigrateSession: func(sess *xorm.Session) (err error) {
+ if err := sess.Sync(new(stepV012), new(workflowV012)); err != nil {
+ return fmt.Errorf("sync models failed: %w", err)
+ }
+
+ // Step
+ if err := renameColumn(sess, "steps", "stopped", "finished"); err != nil {
+ return err
+ }
+
+ // Workflow
+ if err := renameColumn(sess, "workflows", "stopped", "finished"); err != nil {
+ return err
+ }
+
+ return nil
+ },
+}
diff --git a/server/store/datastore/migration/009_lowercase_secret_names.go b/server/store/datastore/migration/013_fix_v31_registries.go
similarity index 67%
rename from server/store/datastore/migration/009_lowercase_secret_names.go
rename to server/store/datastore/migration/013_fix_v31_registries.go
index 5402dc36c..988e49541 100644
--- a/server/store/datastore/migration/009_lowercase_secret_names.go
+++ b/server/store/datastore/migration/013_fix_v31_registries.go
@@ -1,10 +1,10 @@
-// Copyright 2022 Woodpecker Authors
+// Copyright 2024 Woodpecker Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
@@ -19,10 +19,17 @@ import (
"xorm.io/xorm"
)
-var lowercaseSecretNames = xormigrate.Migration{
- ID: "lowercase-secret-names",
+var fixV31Registries = xormigrate.Migration{
+ ID: "fix-v31-registries",
MigrateSession: func(sess *xorm.Session) (err error) {
- _, err = sess.Exec("UPDATE secrets SET secret_name = LOWER(secret_name);")
- return err
+ has, err := sess.IsTableExist("registry_v031")
+ if err != nil {
+ return err
+ }
+ if has {
+ return sess.DropTable("registry_v031")
+ }
+
+ return nil
},
}
diff --git a/server/store/datastore/migration/013_rename_remote_to_forge.go b/server/store/datastore/migration/013_rename_remote_to_forge.go
deleted file mode 100644
index 78eff328b..000000000
--- a/server/store/datastore/migration/013_rename_remote_to_forge.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-type oldRepo013 struct {
- ID int64 `xorm:"pk autoincr 'repo_id'"`
- RemoteID string `xorm:"remote_id"`
-}
-
-func (oldRepo013) TableName() string {
- return "repos"
-}
-
-var renameRemoteToForge = xormigrate.Migration{
- ID: "rename-remote-to-forge",
- MigrateSession: func(sess *xorm.Session) error {
- if err := renameColumn(sess, "pipelines", "pipeline_remote", "pipeline_clone_url"); err != nil {
- return err
- }
-
- // make sure the column exist before rename it
- if err := sess.Sync(new(oldRepo013)); err != nil {
- return err
- }
-
- return renameColumn(sess, "repos", "remote_id", "forge_id")
- },
-}
diff --git a/server/store/datastore/migration/014_remove_old_migrations_of_v1.go b/server/store/datastore/migration/014_remove_old_migrations_of_v1.go
new file mode 100644
index 000000000..5f49d559b
--- /dev/null
+++ b/server/store/datastore/migration/014_remove_old_migrations_of_v1.go
@@ -0,0 +1,54 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package migration
+
+import (
+ "src.techknowlogick.com/xormigrate"
+ "xorm.io/xorm"
+)
+
+var removeOldMigrationsOfV1 = xormigrate.Migration{
+ ID: "remove-old-migrations-of-v1",
+ MigrateSession: func(sess *xorm.Session) (err error) {
+ _, err = sess.Table(&xormigrate.Migration{}).In("id", []string{
+ "xorm",
+ "alter-table-drop-repo-fallback",
+ "drop-allow-push-tags-deploys-columns",
+ "fix-pr-secret-event-name",
+ "alter-table-drop-counter",
+ "drop-senders",
+ "alter-table-logs-update-type-of-data",
+ "alter-table-add-secrets-user-id",
+ "lowercase-secret-names",
+ "recreate-agents-table",
+ "rename-builds-to-pipeline",
+ "rename-columns-builds-to-pipeline",
+ "rename-procs-to-steps",
+ "rename-remote-to-forge",
+ "rename-forge-id-to-forge-remote-id",
+ "remove-active-from-users",
+ "remove-inactive-repos",
+ "drop-files",
+ "remove-machine-col",
+ "drop-old-col",
+ "init-log_entries",
+ "migrate-logs-to-log_entries",
+ "parent-steps-to-workflows",
+ "add-orgs",
+ }).Delete()
+
+ return err
+ },
+}
diff --git a/server/store/datastore/migration/014_rename_forge_id_to_forge_remote_id.go b/server/store/datastore/migration/014_rename_forge_id_to_forge_remote_id.go
deleted file mode 100644
index 60a58660d..000000000
--- a/server/store/datastore/migration/014_rename_forge_id_to_forge_remote_id.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var renameForgeIDToForgeRemoteID = xormigrate.Migration{
- ID: "rename-forge-id-to-forge-remote-id",
- MigrateSession: func(sess *xorm.Session) error {
- return renameColumn(sess, "repos", "forge_id", "forge_remote_id")
- },
-}
diff --git a/server/store/datastore/migration/015_add_org_agents.go b/server/store/datastore/migration/015_add_org_agents.go
new file mode 100644
index 000000000..6eb68f55d
--- /dev/null
+++ b/server/store/datastore/migration/015_add_org_agents.go
@@ -0,0 +1,49 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package migration
+
+import (
+ "fmt"
+
+ "src.techknowlogick.com/xormigrate"
+ "xorm.io/xorm"
+
+ "go.woodpecker-ci.org/woodpecker/v2/server/model"
+)
+
+type agentV015 struct {
+ ID int64 `xorm:"pk autoincr 'id'"`
+ OwnerID int64 `xorm:"INDEX 'owner_id'"`
+ OrgID int64 `xorm:"INDEX 'org_id'"`
+}
+
+func (agentV015) TableName() string {
+ return "agents"
+}
+
+var addOrgAgents = xormigrate.Migration{
+ ID: "add-org-agents",
+ MigrateSession: func(sess *xorm.Session) (err error) {
+ if err := sess.Sync(new(agentV015)); err != nil {
+ return fmt.Errorf("sync models failed: %w", err)
+ }
+
+ // Update all existing agents to be global agents
+ _, err = sess.Cols("org_id").Update(&model.Agent{
+ OrgID: model.IDNotSet,
+ })
+ return err
+ },
+}
diff --git a/server/store/datastore/migration/015_remove_active_from_users.go b/server/store/datastore/migration/015_remove_active_from_users.go
deleted file mode 100644
index d0eb785d1..000000000
--- a/server/store/datastore/migration/015_remove_active_from_users.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var removeActiveFromUsers = xormigrate.Migration{
- ID: "remove-active-from-users",
- MigrateSession: func(sess *xorm.Session) error {
- return dropTableColumns(sess, "users", "user_active")
- },
-}
diff --git a/server/store/datastore/migration/007_log_data_type.go b/server/store/datastore/migration/016_add_custom_labels_to_agent.go
similarity index 57%
rename from server/store/datastore/migration/007_log_data_type.go
rename to server/store/datastore/migration/016_add_custom_labels_to_agent.go
index cb70c5d2c..64ef286c9 100644
--- a/server/store/datastore/migration/007_log_data_type.go
+++ b/server/store/datastore/migration/016_add_custom_labels_to_agent.go
@@ -1,4 +1,4 @@
-// Copyright 2023 Woodpecker Authors
+// Copyright 2024 Woodpecker Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -15,26 +15,27 @@
package migration
import (
+ "fmt"
+
"src.techknowlogick.com/xormigrate"
"xorm.io/xorm"
- "xorm.io/xorm/schemas"
)
-var alterTableLogUpdateColumnLogDataType = xormigrate.Migration{
- ID: "alter-table-logs-update-type-of-data",
+type agentV016 struct {
+ ID int64 `xorm:"pk autoincr 'id'"`
+ CustomLabels map[string]string `xorm:"JSON 'custom_labels'"`
+}
+
+func (agentV016) TableName() string {
+ return "agents"
+}
+
+var addCustomLabelsToAgent = xormigrate.Migration{
+ ID: "add-custom-labels-to-agent",
MigrateSession: func(sess *xorm.Session) (err error) {
- dialect := sess.Engine().Dialect().URI().DBType
-
- switch dialect {
- case schemas.POSTGRES:
- _, err = sess.Exec("ALTER TABLE logs ALTER COLUMN log_data TYPE BYTEA")
- case schemas.MYSQL:
- _, err = sess.Exec("ALTER TABLE logs MODIFY COLUMN log_data LONGBLOB")
- default:
- // sqlite does only know BLOB in all cases
- return nil
+ if err := sess.Sync(new(agentV016)); err != nil {
+ return fmt.Errorf("sync models failed: %w", err)
}
-
- return err
+ return nil
},
}
diff --git a/server/store/datastore/migration/016_remove_inactive_repos.go b/server/store/datastore/migration/016_remove_inactive_repos.go
deleted file mode 100644
index 48742f89b..000000000
--- a/server/store/datastore/migration/016_remove_inactive_repos.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var removeInactiveRepos = xormigrate.Migration{
- ID: "remove-inactive-repos",
- MigrateSession: func(sess *xorm.Session) error {
- // If the timeout is 0, the repo was never activated, so we remove it.
- _, err := sess.Table("repos").Where("repo_active = ?", false).And("repo_timeout = ?", 0).Delete()
- if err != nil {
- return err
- }
-
- return dropTableColumns(sess, "users", "user_synced")
- },
-}
diff --git a/server/store/datastore/migration/017_remove_files_table.go b/server/store/datastore/migration/017_remove_files_table.go
deleted file mode 100644
index 8cc99b806..000000000
--- a/server/store/datastore/migration/017_remove_files_table.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-var dropFiles = xormigrate.Migration{
- ID: "drop-files",
- MigrateSession: func(sess *xorm.Session) error {
- return sess.DropTable("files")
- },
-}
diff --git a/server/store/datastore/migration/017_split_trusted.go b/server/store/datastore/migration/017_split_trusted.go
new file mode 100644
index 000000000..ef5e53b37
--- /dev/null
+++ b/server/store/datastore/migration/017_split_trusted.go
@@ -0,0 +1,73 @@
+// Copyright 2024 Woodpecker Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package migration
+
+import (
+ "fmt"
+
+ "src.techknowlogick.com/xormigrate"
+ "xorm.io/xorm"
+
+ "go.woodpecker-ci.org/woodpecker/v2/server/model"
+)
+
+type repoV035 struct {
+ ID int64 `xorm:"pk autoincr 'id'"`
+ IsTrusted bool `xorm:"'trusted'"`
+ Trusted model.TrustedConfiguration `xorm:"json 'trusted_conf'"`
+}
+
+func (repoV035) TableName() string {
+ return "repos"
+}
+
+var splitTrusted = xormigrate.Migration{
+ ID: "split-trusted",
+ MigrateSession: func(sess *xorm.Session) error {
+ if err := sess.Sync(new(repoV035)); err != nil {
+ return fmt.Errorf("sync new models failed: %w", err)
+ }
+
+ if _, err := sess.Where("trusted = ?", false).Cols("trusted_conf").Update(&repoV035{
+ Trusted: model.TrustedConfiguration{
+ Network: false,
+ Security: false,
+ Volumes: false,
+ },
+ }); err != nil {
+ return err
+ }
+
+ if _, err := sess.Where("trusted = ?", true).Cols("trusted_conf").Update(&repoV035{
+ Trusted: model.TrustedConfiguration{
+ Network: true,
+ Security: true,
+ Volumes: true,
+ },
+ }); err != nil {
+ return err
+ }
+
+ if err := dropTableColumns(sess, "repos", "trusted"); err != nil {
+ return err
+ }
+
+ if err := sess.Commit(); err != nil {
+ return err
+ }
+
+ return renameColumn(sess, "repos", "trusted_conf", "trusted")
+ },
+}
diff --git a/server/store/datastore/migration/018_remove_machine_col.go b/server/store/datastore/migration/018_remove_machine_col.go
deleted file mode 100644
index 791104479..000000000
--- a/server/store/datastore/migration/018_remove_machine_col.go
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2023 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-type oldStep018 struct {
- ID int64 `xorm:"pk autoincr 'step_id'"`
- Machine string `xorm:"step_machine"`
-}
-
-func (oldStep018) TableName() string {
- return "steps"
-}
-
-var removeMachineCol = xormigrate.Migration{
- ID: "remove-machine-col",
- MigrateSession: func(sess *xorm.Session) error {
- // make sure step_machine column exists
- if err := sess.Sync(new(oldStep018)); err != nil {
- return err
- }
- return dropTableColumns(sess, "steps", "step_machine")
- },
-}
diff --git a/server/store/datastore/migration/019_drop_old_cols.go b/server/store/datastore/migration/019_drop_old_cols.go
deleted file mode 100644
index f380c924e..000000000
--- a/server/store/datastore/migration/019_drop_old_cols.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2023 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-)
-
-type oldPipeline019 struct {
- ID int64 `xorm:"pk autoincr 'pipeline_id'"`
- Signed bool `xorm:"pipeline_signed"`
- Verified bool `xorm:"pipeline_verified"`
-}
-
-func (oldPipeline019) TableName() string {
- return "pipelines"
-}
-
-var dropOldCols = xormigrate.Migration{
- ID: "drop-old-col",
- MigrateSession: func(sess *xorm.Session) error {
- // make sure columns on pipelines exist
- if err := sess.Sync(new(oldPipeline019)); err != nil {
- return err
- }
- if err := dropTableColumns(sess, "steps", "step_pgid"); err != nil {
- return err
- }
-
- return dropTableColumns(sess, "pipelines", "pipeline_signed", "pipeline_verified")
- },
-}
diff --git a/server/store/datastore/migration/020_alter_logs_table.go b/server/store/datastore/migration/020_alter_logs_table.go
deleted file mode 100644
index 4f13434cb..000000000
--- a/server/store/datastore/migration/020_alter_logs_table.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2023 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "context"
- "encoding/json"
- "fmt"
- "runtime"
-
- "github.com/rs/zerolog/log"
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-
- "go.woodpecker-ci.org/woodpecker/v2/shared/utils"
-)
-
-// perPage020 sets the size of the slice to read per page.
-var perPage020 = 100
-
-type oldLogs020 struct {
- ID int64 `xorm:"pk autoincr 'log_id'"`
- StepID int64 `xorm:"UNIQUE 'log_step_id'"`
- Data []byte `xorm:"LONGBLOB 'log_data'"`
-}
-
-func (oldLogs020) TableName() string {
- return "logs"
-}
-
-type oldLogEntry020 struct {
- Step string `json:"step,omitempty"`
- Time int64 `json:"time,omitempty"`
- Type int `json:"type,omitempty"`
- Pos int `json:"pos,omitempty"`
- Out string `json:"out,omitempty"`
-}
-
-type newLogEntry020 struct {
- ID int64 `xorm:"pk autoincr 'id'"`
- StepID int64 `xorm:"'step_id'"`
- Time int64
- Line int
- Data []byte `xorm:"LONGBLOB"`
- Created int64 `xorm:"created"`
- Type int
-}
-
-func (newLogEntry020) TableName() string {
- return "log_entries"
-}
-
-var initLogsEntriesTable = xormigrate.Migration{
- ID: "init-log_entries",
- MigrateSession: func(sess *xorm.Session) error {
- return sess.Sync(new(newLogEntry020))
- },
-}
-
-var migrateLogs2LogEntries = xormigrate.Migration{
- ID: "migrate-logs-to-log_entries",
- Long: true,
- Migrate: func(e *xorm.Engine) error {
- // make sure old logs table exists
- if exist, err := e.IsTableExist(new(oldLogs020)); !exist || err != nil {
- return err
- }
-
- if err := e.Sync(new(oldLogs020)); err != nil {
- return err
- }
-
- hasJSONErrors := false
-
- page := 0
- offset := 0
- logs := make([]*oldLogs020, 0, perPage020)
- logEntries := make([]*oldLogEntry020, 0, 50)
-
- ctx, cancelCtx := context.WithCancelCause(context.Background())
- defer cancelCtx(nil)
- sigtermCtx := utils.WithContextSigtermCallback(ctx, func() {
- log.Info().Msg("ctrl+c received, stopping current migration")
- })
-
- for {
- if sigtermCtx.Err() != nil {
- return fmt.Errorf("migration 'migrate-logs-to-log_entries' gracefully aborted")
- }
-
- sess := e.NewSession().NoCache()
- defer sess.Close()
- if err := sess.Begin(); err != nil {
- return err
- }
- logs = logs[:0]
-
- err := sess.Limit(perPage020, offset).Find(&logs)
- if err != nil {
- return err
- }
-
- log.Trace().Msgf("migrate-logs-to-log_entries: process page %d", page)
-
- for _, l := range logs {
- logEntries = logEntries[:0]
- if err := json.Unmarshal(l.Data, &logEntries); err != nil {
- hasJSONErrors = true
- offset++
- continue
- }
-
- time := int64(0)
- for _, logEntry := range logEntries {
-
- if logEntry.Time > time {
- time = logEntry.Time
- }
-
- log := &newLogEntry020{
- StepID: l.StepID,
- Data: []byte(logEntry.Out),
- Line: logEntry.Pos,
- Time: time,
- Type: logEntry.Type,
- }
-
- if _, err := sess.Insert(log); err != nil {
- return err
- }
- }
-
- if _, err := sess.Delete(l); err != nil {
- return err
- }
- }
-
- if err := sess.Commit(); err != nil {
- return err
- }
-
- if len(logs) < perPage020 {
- break
- }
-
- runtime.GC()
- page++
- }
-
- if hasJSONErrors {
- return fmt.Errorf("skipped some logs as json could not be deserialized for them")
- }
-
- return e.DropTables("logs")
- },
-}
diff --git a/server/store/datastore/migration/021_parent_steps_to_workflows.go b/server/store/datastore/migration/021_parent_steps_to_workflows.go
deleted file mode 100644
index a97efb1d2..000000000
--- a/server/store/datastore/migration/021_parent_steps_to_workflows.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "src.techknowlogick.com/xormigrate"
- "xorm.io/xorm"
-
- "go.woodpecker-ci.org/woodpecker/v2/server/model"
-)
-
-type oldStep021 struct {
- ID int64 `xorm:"pk autoincr 'step_id'"`
- PipelineID int64 `xorm:"UNIQUE(s) INDEX 'step_pipeline_id'"`
- PID int `xorm:"UNIQUE(s) 'step_pid'"`
- PPID int `xorm:"step_ppid"`
- Name string `xorm:"step_name"`
- State model.StatusValue `xorm:"step_state"`
- Error string `xorm:"TEXT 'step_error'"`
- Started int64 `xorm:"step_started"`
- Stopped int64 `xorm:"step_stopped"`
- AgentID int64 `xorm:"step_agent_id"`
- Platform string `xorm:"step_platform"`
- Environ map[string]string `xorm:"json 'step_environ'"`
-}
-
-func (oldStep021) TableName() string {
- return "steps"
-}
-
-var parentStepsToWorkflows = xormigrate.Migration{
- ID: "parent-steps-to-workflows",
- MigrateSession: func(sess *xorm.Session) error {
- if err := sess.Sync(new(workflowV031)); err != nil {
- return err
- }
- // make sure the columns exist before removing them
- if err := sess.Sync(new(oldStep021)); err != nil {
- return err
- }
-
- var parentSteps []*oldStep021
- err := sess.Where("step_ppid = ?", 0).Find(&parentSteps)
- if err != nil {
- return err
- }
-
- for _, p := range parentSteps {
- asWorkflow := &workflowV031{
- PipelineID: p.PipelineID,
- PID: p.PID,
- Name: p.Name,
- State: p.State,
- Error: p.Error,
- Started: p.Started,
- Stopped: p.Stopped,
- AgentID: p.AgentID,
- Platform: p.Platform,
- Environ: p.Environ,
- }
-
- _, err = sess.Insert(asWorkflow)
- if err != nil {
- return err
- }
-
- _, err = sess.Delete(&oldStep021{ID: p.ID})
- if err != nil {
- return err
- }
- }
-
- return dropTableColumns(sess, "steps", "step_agent_id", "step_platform", "step_environ")
- },
-}
diff --git a/server/store/datastore/migration/022_add_orgs.go b/server/store/datastore/migration/022_add_orgs.go
deleted file mode 100644
index 9d93e0537..000000000
--- a/server/store/datastore/migration/022_add_orgs.go
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2022 Woodpecker Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package migration
-
-import (
- "fmt"
- "strings"
-
- "src.techknowlogick.com/xormigrate"
- "xorm.io/builder"
- "xorm.io/xorm"
-
- "go.woodpecker-ci.org/woodpecker/v2/server/model"
-)
-
-type oldSecret022 struct {
- ID int64 `xorm:"pk autoincr 'secret_id'"`
- Owner string `xorm:"'secret_owner'"`
- OrgID int64 `xorm:"NOT NULL DEFAULT 0 'secret_org_id'"`
- RepoID int64 `xorm:"NOT NULL DEFAULT 0 'secret_repo_id'"`
- Name string `xorm:"NOT NULL INDEX 'secret_name'"`
-}
-
-func (oldSecret022) TableName() string {
- return "secrets"
-}
-
-type syncRepo022 struct {
- OrgID int64 `json:"org_id" xorm:"repo_org_id"`
-}
-
-// TableName return database table name for xorm.
-func (syncRepo022) TableName() string {
- return "repos"
-}
-
-type repo022 struct {
- ID int64 `json:"id,omitempty" xorm:"pk autoincr 'repo_id'"`
- OrgID int64 `json:"org_id" xorm:"repo_org_id"`
- Owner string `json:"owner" xorm:"UNIQUE(name) 'repo_owner'"`
-}
-
-// TableName return database table name for xorm.
-func (repo022) TableName() string {
- return "repos"
-}
-
-var addOrgs = xormigrate.Migration{
- ID: "add-orgs",
- MigrateSession: func(sess *xorm.Session) error {
- if exist, err := sess.IsTableExist("orgs"); exist && err == nil {
- if err := sess.DropTable("orgs"); err != nil {
- return fmt.Errorf("drop old orgs table failed: %w", err)
- }
- }
-
- if err := sess.Sync(new(model.Org), new(syncRepo022), new(userV031)); err != nil {
- return fmt.Errorf("sync new models failed: %w", err)
- }
-
- // make sure the columns exist before removing them
- if _, err := sess.SyncWithOptions(xorm.SyncOptions{IgnoreConstrains: true, IgnoreIndices: true}, new(oldSecret022)); err != nil {
- return fmt.Errorf("sync old secrets models failed: %w", err)
- }
-
- // get all org names from repos
- var repos []*repo022
- if err := sess.Find(&repos); err != nil {
- return fmt.Errorf("find all repos failed: %w", err)
- }
-
- orgs := make(map[string]*model.Org)
- users := make(map[string]bool)
- for _, repo := range repos {
- orgName := strings.ToLower(repo.Owner)
-
- // check if it's a registered user
- if _, ok := users[orgName]; !ok {
- exist, err := sess.Where("user_login = ?", orgName).Exist(new(userV031))
- if err != nil {
- return fmt.Errorf("check if user '%s' exist failed: %w", orgName, err)
- }
- users[orgName] = exist
- }
-
- // create org if not already created
- if _, ok := orgs[orgName]; !ok {
- org := &model.Org{
- Name: orgName,
- IsUser: users[orgName],
- }
- if _, err := sess.Insert(org); err != nil {
- return fmt.Errorf("insert org %#v failed: %w", org, err)
- }
- orgs[orgName] = org
-
- // update org secrets
- var secrets []*oldSecret022
- if err := sess.Where(builder.Eq{"secret_owner": orgName, "secret_repo_id": 0}).Find(&secrets); err != nil {
- return fmt.Errorf("get org secrets failed: %w", err)
- }
-
- for _, secret := range secrets {
- secret.OrgID = org.ID
- if _, err := sess.ID(secret.ID).Cols("secret_org_id").Update(secret); err != nil {
- return fmt.Errorf("update org secret %d failed: %w", secret.ID, err)
- }
- }
- }
-
- // update the repo
- repo.OrgID = orgs[orgName].ID
- if _, err := sess.ID(repo.ID).Cols("repo_org_id").Update(repo); err != nil {
- return fmt.Errorf("update repos failed: %w", err)
- }
- }
-
- return dropTableColumns(sess, "secrets", "secret_owner")
- },
-}
diff --git a/server/store/datastore/migration/common.go b/server/store/datastore/migration/common.go
index d705f99be..5fd10c534 100644
--- a/server/store/datastore/migration/common.go
+++ b/server/store/datastore/migration/common.go
@@ -76,66 +76,14 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
}
}
- // Here we need to get the columns from the original table
- sql := fmt.Sprintf("SELECT sql FROM sqlite_master WHERE tbl_name='%s' and type='table'", tableName)
- res, err := sess.Query(sql)
- if err != nil {
- return err
- }
- tableSQL := normalizeSQLiteTableSchema(string(res[0]["sql"]))
-
- // Separate out the column definitions
- sqlIndex := strings.Index(tableSQL, "(")
- if sqlIndex < 0 {
- return fmt.Errorf("could not separate column definitions")
- }
- tableSQL = tableSQL[sqlIndex:]
-
- // Remove the required columnNames
- tableSQL = removeColumnFromSQLITETableSchema(tableSQL, columnNames...)
-
- // Ensure the query is ended properly
- tableSQL = strings.TrimSpace(tableSQL)
- if tableSQL[len(tableSQL)-1] != ')' {
- if tableSQL[len(tableSQL)-1] == ',' {
- tableSQL = tableSQL[:len(tableSQL)-1]
+ // Now drop the columns
+ for _, columnName := range columnNames {
+ _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` DROP COLUMN `%s`;", tableName, columnName))
+ if err != nil {
+ return fmt.Errorf("table `%s`, drop column %v: %w", tableName, columnName, err)
}
- tableSQL += ")"
}
- // Find all the columns in the table
- var columns []string
- for _, rawColumn := range strings.Split(strings.ReplaceAll(tableSQL[1:len(tableSQL)-1], ", ", ",\n"), "\n") {
- if strings.ContainsAny(rawColumn, "()") {
- continue
- }
- rawColumn = strings.TrimSpace(rawColumn)
- columns = append(columns,
- strings.ReplaceAll(rawColumn[0:strings.Index(rawColumn, " ")], "`", ""),
- )
- }
-
- tableSQL = fmt.Sprintf("CREATE TABLE `new_%s_new` ", tableName) + tableSQL
- if _, err := sess.Exec(tableSQL); err != nil {
- return err
- }
-
- // Now restore the data
- columnsSeparated := strings.Join(columns, ",")
- insertSQL := fmt.Sprintf("INSERT INTO `new_%s_new` (%s) SELECT %s FROM %s", tableName, columnsSeparated, columnsSeparated, tableName)
- if _, err := sess.Exec(insertSQL); err != nil {
- return err
- }
-
- // Now drop the old table
- if _, err := sess.Exec(fmt.Sprintf("DROP TABLE `%s`", tableName)); err != nil {
- return err
- }
-
- // Rename the table
- if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `new_%s_new` RENAME TO `%s`", tableName, tableName)); err != nil {
- return err
- }
case schemas.POSTGRES:
cols := ""
for _, col := range columnNames {
@@ -145,7 +93,7 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
cols += "DROP COLUMN `" + col + "` CASCADE"
}
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
- return fmt.Errorf("drop table `%s` columns %v: %w", tableName, columnNames, err)
+ return fmt.Errorf("table `%s`, drop columns %v: %w", tableName, columnNames, err)
}
case schemas.MYSQL:
// Drop indexes on columns first
@@ -173,7 +121,7 @@ func dropTableColumns(sess *xorm.Session, tableName string, columnNames ...strin
cols += "DROP COLUMN `" + col + "`"
}
if _, err := sess.Exec(fmt.Sprintf("ALTER TABLE `%s` %s", tableName, cols)); err != nil {
- return fmt.Errorf("drop table `%s` columns %v: %w", tableName, columnNames, err)
+ return fmt.Errorf("table `%s`, drop columns %v: %w", tableName, columnNames, err)
}
default:
return fmt.Errorf("dialect '%s' not supported", dialect)
@@ -214,7 +162,6 @@ func alterColumnDefault(sess *xorm.Session, table, column, defValue string) erro
}
}
-//nolint:unparam
func alterColumnNull(sess *xorm.Session, table, column string, null bool) error {
val := "NULL"
if !null {
diff --git a/server/store/datastore/migration/migration.go b/server/store/datastore/migration/migration.go
index 4c905e66e..d12e21628 100644
--- a/server/store/datastore/migration/migration.go
+++ b/server/store/datastore/migration/migration.go
@@ -29,30 +29,6 @@ import (
// They are executed in order and if one fails Xormigrate will try to rollback that specific one and quits.
var migrationTasks = []*xormigrate.Migration{
&legacyToXormigrate,
- &legacy2Xorm,
- &alterTableReposDropFallback,
- &alterTableReposDropAllowDeploysAllowTags,
- &fixPRSecretEventName,
- &alterTableReposDropCounter,
- &dropSenders,
- &alterTableLogUpdateColumnLogDataType,
- &alterTableSecretsAddUserCol,
- &recreateAgentsTable,
- &lowercaseSecretNames,
- &renameBuildsToPipeline,
- &renameColumnsBuildsToPipeline,
- &renameTableProcsToSteps,
- &renameRemoteToForge,
- &renameForgeIDToForgeRemoteID,
- &removeActiveFromUsers,
- &removeInactiveRepos,
- &dropFiles,
- &removeMachineCol,
- &dropOldCols,
- &initLogsEntriesTable,
- &migrateLogs2LogEntries,
- &parentStepsToWorkflows,
- &addOrgs,
&addOrgID,
&alterTableTasksUpdateColumnTaskDataType,
&alterTableConfigUpdateColumnConfigDataType,
@@ -63,6 +39,13 @@ var migrationTasks = []*xormigrate.Migration{
&setForgeID,
&unifyColumnsTables,
&alterTableRegistriesFixRequiredFields,
+ &cronWithoutSec,
+ &renameStartEndTime,
+ &fixV31Registries,
+ &removeOldMigrationsOfV1,
+ &addOrgAgents,
+ &addCustomLabelsToAgent,
+ &splitTrusted,
}
var allBeans = []any{
diff --git a/server/store/datastore/migration/test-files/sqlite.db b/server/store/datastore/migration/test-files/sqlite.db
index 219e5184a..731dfe5cd 100644
Binary files a/server/store/datastore/migration/test-files/sqlite.db and b/server/store/datastore/migration/test-files/sqlite.db differ
diff --git a/server/store/datastore/server_config.go b/server/store/datastore/server_config.go
index 2dd52f406..a18517edb 100644
--- a/server/store/datastore/server_config.go
+++ b/server/store/datastore/server_config.go
@@ -31,7 +31,13 @@ func (s storage) ServerConfigSet(key, value string) error {
Key: key,
}
- count, err := s.engine.Count(config)
+ sess := s.engine.NewSession()
+ defer sess.Close()
+ if err := sess.Begin(); err != nil {
+ return err
+ }
+
+ count, err := sess.Count(config)
if err != nil {
return err
}
@@ -39,12 +45,15 @@ func (s storage) ServerConfigSet(key, value string) error {
config.Value = value
if count == 0 {
- _, err := s.engine.Insert(config)
+ _, err = sess.Insert(config)
+ } else {
+ _, err = sess.Where("`key` = ?", config.Key).Cols("value").Update(config)
+ }
+ if err != nil {
return err
}
- _, err = s.engine.Where("`key` = ?", config.Key).Cols("value").Update(config)
- return err
+ return sess.Commit()
}
func (s storage) ServerConfigDelete(key string) error {
diff --git a/server/store/mocks/store.go b/server/store/mocks/store.go
index 55d7257aa..3b778395c 100644
--- a/server/store/mocks/store.go
+++ b/server/store/mocks/store.go
@@ -143,6 +143,36 @@ func (_m *Store) AgentList(p *model.ListOptions) ([]*model.Agent, error) {
return r0, r1
}
+// AgentListForOrg provides a mock function with given fields: orgID, opt
+func (_m *Store) AgentListForOrg(orgID int64, opt *model.ListOptions) ([]*model.Agent, error) {
+ ret := _m.Called(orgID, opt)
+
+ if len(ret) == 0 {
+ panic("no return value specified for AgentListForOrg")
+ }
+
+ var r0 []*model.Agent
+ var r1 error
+ if rf, ok := ret.Get(0).(func(int64, *model.ListOptions) ([]*model.Agent, error)); ok {
+ return rf(orgID, opt)
+ }
+ if rf, ok := ret.Get(0).(func(int64, *model.ListOptions) []*model.Agent); ok {
+ r0 = rf(orgID, opt)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).([]*model.Agent)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(int64, *model.ListOptions) error); ok {
+ r1 = rf(orgID, opt)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
// AgentUpdate provides a mock function with given fields: _a0
func (_m *Store) AgentUpdate(_a0 *model.Agent) error {
ret := _m.Called(_a0)
@@ -1340,17 +1370,17 @@ func (_m *Store) HasRedirectionForRepo(_a0 int64, _a1 string) (bool, error) {
return r0, r1
}
-// LogAppend provides a mock function with given fields: logEntry
-func (_m *Store) LogAppend(logEntry *model.LogEntry) error {
- ret := _m.Called(logEntry)
+// LogAppend provides a mock function with given fields: _a0, _a1
+func (_m *Store) LogAppend(_a0 *model.Step, _a1 []*model.LogEntry) error {
+ ret := _m.Called(_a0, _a1)
if len(ret) == 0 {
panic("no return value specified for LogAppend")
}
var r0 error
- if rf, ok := ret.Get(0).(func(*model.LogEntry) error); ok {
- r0 = rf(logEntry)
+ if rf, ok := ret.Get(0).(func(*model.Step, []*model.LogEntry) error); ok {
+ r0 = rf(_a0, _a1)
} else {
r0 = ret.Error(0)
}
diff --git a/server/store/store.go b/server/store/store.go
index ff408f075..a3503e386 100644
--- a/server/store/store.go
+++ b/server/store/store.go
@@ -143,7 +143,7 @@ type Store interface {
// Logs
LogFind(*model.Step) ([]*model.LogEntry, error)
- LogAppend(logEntry *model.LogEntry) error
+ LogAppend(*model.Step, []*model.LogEntry) error
LogDelete(*model.Step) error
// Tasks
@@ -180,6 +180,7 @@ type Store interface {
AgentList(p *model.ListOptions) ([]*model.Agent, error)
AgentUpdate(*model.Agent) error
AgentDelete(*model.Agent) error
+ AgentListForOrg(orgID int64, opt *model.ListOptions) ([]*model.Agent, error)
// Workflow
WorkflowGetTree(*model.Pipeline) ([]*model.Workflow, error)
diff --git a/shared/constant/constant.go b/shared/constant/constant.go
index 0034b49fe..e6cfa63ed 100644
--- a/shared/constant/constant.go
+++ b/shared/constant/constant.go
@@ -14,14 +14,7 @@
package constant
-// PrivilegedPlugins can be changed by 'WOODPECKER_ESCALATE' at runtime.
-var PrivilegedPlugins = []string{
- "plugins/docker",
- "plugins/gcr",
- "plugins/ecr",
- "woodpeckerci/plugin-docker-buildx",
- "codeberg.org/woodpecker-plugins/docker-buildx",
-}
+import "time"
// DefaultConfigOrder represent the priority in witch woodpecker search for a pipeline config by default
// folders are indicated by supplying a trailing slash.
@@ -32,12 +25,17 @@ var DefaultConfigOrder = [...]string{
}
const (
- // DefaultCloneImage can be changed by 'WOODPECKER_DEFAULT_CLONE_IMAGE' at runtime.
+ // DefaultClonePlugin can be changed by 'WOODPECKER_DEFAULT_CLONE_PLUGIN' at runtime.
// renovate: datasource=docker depName=woodpeckerci/plugin-git
- DefaultCloneImage = "docker.io/woodpeckerci/plugin-git:2.5.1"
+ DefaultClonePlugin = "docker.io/woodpeckerci/plugin-git:2.6.0"
)
-var TrustedCloneImages = []string{
- DefaultCloneImage,
+// TrustedClonePlugins can be changed by 'WOODPECKER_PLUGINS_TRUSTED_CLONE' at runtime.
+var TrustedClonePlugins = []string{
+ DefaultClonePlugin,
+ "docker.io/woodpeckerci/plugin-git",
"quay.io/woodpeckerci/plugin-git",
}
+
+// TaskTimeout is the time till a running task is counted as dead.
+var TaskTimeout = time.Minute
diff --git a/web/.prettierrc.js b/web/.prettierrc.js
index d44e794b4..1fb217ea6 100644
--- a/web/.prettierrc.js
+++ b/web/.prettierrc.js
@@ -1,5 +1,6 @@
import { readFile } from 'node:fs/promises';
+// eslint-disable-next-line antfu/no-top-level-await
const config = JSON.parse(await readFile(new URL('../.prettierrc.json', import.meta.url)));
export default {
diff --git a/web/eslint.config.js b/web/eslint.config.js
index d218b3d99..1b704b719 100644
--- a/web/eslint.config.js
+++ b/web/eslint.config.js
@@ -4,6 +4,7 @@
import antfu from '@antfu/eslint-config';
import js from '@eslint/js';
import vueI18n from '@intlify/eslint-plugin-vue-i18n';
+import eslintPromise from 'eslint-plugin-promise';
import eslintPluginVueScopedCSS from 'eslint-plugin-vue-scoped-css';
export default antfu(
@@ -20,23 +21,54 @@ export default antfu(
},
js.configs.recommended,
- // eslintPromise.configs.recommended,
-
- // TypeScript
- //...tseslint.configs.recommended,
- //...tseslint.configs.recommendedTypeChecked,
- //...tseslint.configs.strictTypeChecked,
- //...tseslint.configs.stylisticTypeChecked,
+ eslintPromise.configs['flat/recommended'],
+ ...eslintPluginVueScopedCSS.configs['flat/recommended'],
+ ...vueI18n.configs['flat/recommended'],
{
rules: {
'import/order': 'off',
'sort-imports': 'off',
+ 'perfectionist/sort-imports': 'off',
+ 'perfectionist/sort-named-imports': 'off',
+ 'promise/prefer-await-to-callbacks': 'error',
+
+ // Vue I18n
+ '@intlify/vue-i18n/no-raw-text': [
+ 'error',
+ {
+ attributes: {
+ '/.+/': ['label'],
+ },
+ },
+ ],
+ '@intlify/vue-i18n/key-format-style': ['error', 'snake_case'],
+ '@intlify/vue-i18n/no-duplicate-keys-in-locale': 'error',
+ '@intlify/vue-i18n/no-dynamic-keys': 'error',
+ '@intlify/vue-i18n/no-deprecated-i18n-component': 'error',
+ '@intlify/vue-i18n/no-deprecated-tc': 'error',
+ '@intlify/vue-i18n/no-i18n-t-path-prop': 'error',
+ '@intlify/vue-i18n/no-missing-keys-in-other-locales': 'off',
+ '@intlify/vue-i18n/valid-message-syntax': 'error',
+ '@intlify/vue-i18n/no-missing-keys': 'error',
+ '@intlify/vue-i18n/no-unknown-locale': 'error',
+ '@intlify/vue-i18n/no-unused-keys': ['error', { extensions: ['.ts', '.vue'] }],
+ '@intlify/vue-i18n/prefer-sfc-lang-attr': 'error',
+ '@intlify/vue-i18n/no-html-messages': 'error',
+ '@intlify/vue-i18n/prefer-linked-key-with-paren': 'error',
+ '@intlify/vue-i18n/sfc-locale-attr': 'error',
+ },
+ settings: {
+ // Vue I18n
+ 'vue-i18n': {
+ localeDir: './src/assets/locales/en.json',
+ // Specify the version of `vue-i18n` you are using.
+ // If not specified, the message will be parsed twice.
+ messageSyntaxVersion: '^9.0.0',
+ },
},
},
- ...eslintPluginVueScopedCSS.configs['flat/recommended'],
-
// Vue
{
files: ['**/*.vue'],
@@ -64,44 +96,6 @@ export default antfu(
},
},
- // Vue I18n
- ...vueI18n.configs['flat/recommended'],
- {
- rules: {
- '@intlify/vue-i18n/no-raw-text': [
- 'error',
- {
- attributes: {
- '/.+/': ['label'],
- },
- },
- ],
- '@intlify/vue-i18n/key-format-style': ['error', 'snake_case'],
- '@intlify/vue-i18n/no-duplicate-keys-in-locale': 'error',
- '@intlify/vue-i18n/no-dynamic-keys': 'error',
- '@intlify/vue-i18n/no-deprecated-i18n-component': 'error',
- '@intlify/vue-i18n/no-deprecated-tc': 'error',
- '@intlify/vue-i18n/no-i18n-t-path-prop': 'error',
- '@intlify/vue-i18n/no-missing-keys-in-other-locales': 'off',
- '@intlify/vue-i18n/valid-message-syntax': 'error',
- '@intlify/vue-i18n/no-missing-keys': 'error',
- '@intlify/vue-i18n/no-unknown-locale': 'error',
- '@intlify/vue-i18n/no-unused-keys': ['error', { extensions: ['.ts', '.vue'] }],
- '@intlify/vue-i18n/prefer-sfc-lang-attr': 'error',
- '@intlify/vue-i18n/no-html-messages': 'error',
- '@intlify/vue-i18n/prefer-linked-key-with-paren': 'error',
- '@intlify/vue-i18n/sfc-locale-attr': 'error',
- },
- settings: {
- 'vue-i18n': {
- localeDir: './src/assets/locales/en.json',
- // Specify the version of `vue-i18n` you are using.
- // If not specified, the message will be parsed twice.
- messageSyntaxVersion: '^9.0.0',
- },
- },
- },
-
// Ignore list
{
ignores: [
diff --git a/web/package.json b/web/package.json
index 9cecaf5be..bcf0e9d18 100644
--- a/web/package.json
+++ b/web/package.json
@@ -18,53 +18,52 @@
"test": "vitest"
},
"dependencies": {
- "@intlify/unplugin-vue-i18n": "^4.0.0",
+ "@intlify/unplugin-vue-i18n": "^5.0.0",
"@kyvg/vue3-notification": "^3.2.1",
"@mdi/js": "^7.4.47",
- "@vueuse/core": "^10.10.0",
+ "@vueuse/core": "^11.0.0",
"ansi_up": "^6.0.2",
- "dayjs": "^1.11.11",
+ "dayjs": "^1.11.12",
"fuse.js": "^7.0.0",
"js-base64": "^3.7.7",
"lodash": "^4.17.21",
"node-emoji": "^2.1.3",
- "pinia": "^2.1.7",
+ "pinia": "^2.2.1",
"prismjs": "^1.29.0",
- "semver": "^7.6.2",
- "simple-icons": "^12.3.0",
- "vue": "^3.4.27",
- "vue-i18n": "^9.13.1",
- "vue-router": "^4.3.2"
+ "semver": "^7.6.3",
+ "simple-icons": "^13.5.0",
+ "vue": "^3.4.38",
+ "vue-i18n": "^10.0.3",
+ "vue-router": "^4.4.3"
},
"devDependencies": {
- "@antfu/eslint-config": "^2.20.0",
- "@eslint/js": "^9.4.0",
- "@ianvs/prettier-plugin-sort-imports": "^4.2.1",
+ "@antfu/eslint-config": "^3.3.2",
+ "@eslint/js": "^9.9.0",
+ "@ianvs/prettier-plugin-sort-imports": "^4.3.1",
"@intlify/eslint-plugin-vue-i18n": "3.0.0",
"@types/eslint__js": "^8.42.3",
- "@types/lodash": "^4.17.4",
- "@types/node": "^20.14.2",
+ "@types/lodash": "^4.17.7",
+ "@types/node": "^20.14.15",
"@types/prismjs": "^1.26.4",
"@types/semver": "^7.5.8",
"@types/tinycolor2": "^1.4.6",
- "@vitejs/plugin-vue": "^5.0.5",
- "@vue/compiler-sfc": "^3.4.27",
+ "@vitejs/plugin-vue": "^5.1.2",
+ "@vue/compiler-sfc": "^3.4.38",
"@vue/test-utils": "^2.4.6",
- "eslint": "^9.4.0",
- "eslint-plugin-promise": "^6.2.0",
- "eslint-plugin-vue-scoped-css": "^2.8.0",
- "jsdom": "^24.1.0",
- "prettier": "^3.3.0",
- "replace-in-file": "^8.0.0",
+ "eslint": "^9.9.0",
+ "eslint-plugin-promise": "^7.1.0",
+ "eslint-plugin-vue-scoped-css": "^2.8.1",
+ "jsdom": "^25.0.0",
+ "prettier": "^3.3.3",
+ "replace-in-file": "^8.1.0",
"tinycolor2": "^1.6.0",
- "typescript": "5.5.3",
- "typescript-eslint": "^7.12.0",
- "vite": "^5.2.12",
+ "typescript": "5.6.3",
+ "vite": "^5.4.1",
"vite-plugin-prismjs": "^0.0.11",
"vite-plugin-windicss": "^1.9.3",
"vite-svg-loader": "^5.1.0",
- "vitest": "^2.0.0",
- "vue-tsc": "^2.0.19",
+ "vitest": "^2.0.5",
+ "vue-tsc": "^2.0.29",
"windicss": "^3.5.6"
},
"pnpm": {
diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml
index 40ac6169d..b07962677 100644
--- a/web/pnpm-lock.yaml
+++ b/web/pnpm-lock.yaml
@@ -12,23 +12,23 @@ importers:
.:
dependencies:
'@intlify/unplugin-vue-i18n':
- specifier: ^4.0.0
- version: 4.0.0(rollup@4.18.1)(vue-i18n@9.13.1(vue@3.4.32(typescript@5.5.3)))
+ specifier: ^5.0.0
+ version: 5.2.0(@vue/compiler-dom@3.5.12)(eslint@9.13.0(jiti@1.21.6))(rollup@4.24.0)(typescript@5.6.3)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))
'@kyvg/vue3-notification':
specifier: ^3.2.1
- version: 3.2.1(vue@3.4.32(typescript@5.5.3))
+ version: 3.4.0(vue@3.5.12(typescript@5.6.3))
'@mdi/js':
specifier: ^7.4.47
version: 7.4.47
'@vueuse/core':
- specifier: ^10.10.0
- version: 10.11.0(vue@3.4.32(typescript@5.5.3))
+ specifier: ^11.0.0
+ version: 11.1.0(vue@3.5.12(typescript@5.6.3))
ansi_up:
specifier: ^6.0.2
version: 6.0.2
dayjs:
- specifier: ^1.11.11
- version: 1.11.12
+ specifier: ^1.11.12
+ version: 1.11.13
fuse.js:
specifier: ^7.0.0
version: 7.0.0
@@ -42,51 +42,51 @@ importers:
specifier: ^2.1.3
version: 2.1.3
pinia:
- specifier: ^2.1.7
- version: 2.1.7(typescript@5.5.3)(vue@3.4.32(typescript@5.5.3))
+ specifier: ^2.2.1
+ version: 2.2.4(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3))
prismjs:
specifier: ^1.29.0
version: 1.29.0
semver:
- specifier: ^7.6.2
+ specifier: ^7.6.3
version: 7.6.3
simple-icons:
- specifier: ^12.3.0
- version: 12.4.0
+ specifier: ^13.5.0
+ version: 13.15.0
vue:
- specifier: ^3.4.27
- version: 3.4.32(typescript@5.5.3)
+ specifier: ^3.4.38
+ version: 3.5.12(typescript@5.6.3)
vue-i18n:
- specifier: ^9.13.1
- version: 9.13.1(vue@3.4.32(typescript@5.5.3))
+ specifier: ^10.0.3
+ version: 10.0.4(vue@3.5.12(typescript@5.6.3))
vue-router:
- specifier: ^4.3.2
- version: 4.4.0(vue@3.4.32(typescript@5.5.3))
+ specifier: ^4.4.3
+ version: 4.4.5(vue@3.5.12(typescript@5.6.3))
devDependencies:
'@antfu/eslint-config':
- specifier: ^2.20.0
- version: 2.23.0(@vue/compiler-sfc@3.4.32)(eslint@9.7.0)(typescript@5.5.3)(vitest@2.0.3(@types/node@20.14.11)(jsdom@24.1.0)(stylus@0.57.0))
+ specifier: ^3.3.2
+ version: 3.8.0(@typescript-eslint/utils@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.12)(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.3(@types/node@20.17.1)(jsdom@25.0.1)(stylus@0.57.0))
'@eslint/js':
- specifier: ^9.4.0
- version: 9.7.0
+ specifier: ^9.9.0
+ version: 9.13.0
'@ianvs/prettier-plugin-sort-imports':
- specifier: ^4.2.1
- version: 4.3.1(@vue/compiler-sfc@3.4.32)(prettier@3.3.3)
+ specifier: ^4.3.1
+ version: 4.3.1(@vue/compiler-sfc@3.5.12)(prettier@3.3.3)
'@intlify/eslint-plugin-vue-i18n':
specifier: 3.0.0
- version: 3.0.0(eslint@9.7.0)
+ version: 3.0.0(eslint@9.13.0(jiti@1.21.6))
'@types/eslint__js':
specifier: ^8.42.3
version: 8.42.3
'@types/lodash':
- specifier: ^4.17.4
- version: 4.17.7
+ specifier: ^4.17.7
+ version: 4.17.12
'@types/node':
- specifier: ^20.14.2
- version: 20.14.11
+ specifier: ^20.14.15
+ version: 20.17.1
'@types/prismjs':
specifier: ^1.26.4
- version: 1.26.4
+ version: 1.26.5
'@types/semver':
specifier: ^7.5.8
version: 7.5.8
@@ -94,59 +94,56 @@ importers:
specifier: ^1.4.6
version: 1.4.6
'@vitejs/plugin-vue':
- specifier: ^5.0.5
- version: 5.0.5(vite@5.3.4(@types/node@20.14.11)(stylus@0.57.0))(vue@3.4.32(typescript@5.5.3))
+ specifier: ^5.1.2
+ version: 5.1.4(vite@5.4.10(@types/node@20.17.1)(stylus@0.57.0))(vue@3.5.12(typescript@5.6.3))
'@vue/compiler-sfc':
- specifier: ^3.4.27
- version: 3.4.32
+ specifier: ^3.4.38
+ version: 3.5.12
'@vue/test-utils':
specifier: ^2.4.6
version: 2.4.6
eslint:
- specifier: ^9.4.0
- version: 9.7.0
+ specifier: ^9.9.0
+ version: 9.13.0(jiti@1.21.6)
eslint-plugin-promise:
- specifier: ^6.2.0
- version: 6.4.0(eslint@9.7.0)
+ specifier: ^7.1.0
+ version: 7.1.0(eslint@9.13.0(jiti@1.21.6))
eslint-plugin-vue-scoped-css:
- specifier: ^2.8.0
- version: 2.8.1(eslint@9.7.0)(vue-eslint-parser@9.4.3(eslint@9.7.0))
+ specifier: ^2.8.1
+ version: 2.8.1(eslint@9.13.0(jiti@1.21.6))(vue-eslint-parser@9.4.3(eslint@9.13.0(jiti@1.21.6)))
jsdom:
- specifier: ^24.1.0
- version: 24.1.0
+ specifier: ^25.0.0
+ version: 25.0.1
prettier:
- specifier: ^3.3.0
+ specifier: ^3.3.3
version: 3.3.3
replace-in-file:
- specifier: ^8.0.0
- version: 8.1.0
+ specifier: ^8.1.0
+ version: 8.2.0
tinycolor2:
specifier: ^1.6.0
version: 1.6.0
typescript:
- specifier: 5.5.3
- version: 5.5.3
- typescript-eslint:
- specifier: ^7.12.0
- version: 7.16.1(eslint@9.7.0)(typescript@5.5.3)
+ specifier: 5.6.3
+ version: 5.6.3
vite:
- specifier: ^5.2.12
- version: 5.3.4(@types/node@20.14.11)(stylus@0.57.0)
+ specifier: ^5.4.1
+ version: 5.4.10(@types/node@20.17.1)(stylus@0.57.0)
vite-plugin-prismjs:
specifier: ^0.0.11
version: 0.0.11(prismjs@1.29.0)
vite-plugin-windicss:
specifier: ^1.9.3
- version: 1.9.3(vite@5.3.4(@types/node@20.14.11)(stylus@0.57.0))
+ version: 1.9.3(vite@5.4.10(@types/node@20.17.1)(stylus@0.57.0))
vite-svg-loader:
specifier: ^5.1.0
- version: 5.1.0(vue@3.4.32(typescript@5.5.3))
+ version: 5.1.0(vue@3.5.12(typescript@5.6.3))
vitest:
- specifier: ^2.0.0
- version: 2.0.3(@types/node@20.14.11)(jsdom@24.1.0)(stylus@0.57.0)
+ specifier: ^2.0.5
+ version: 2.1.3(@types/node@20.17.1)(jsdom@25.0.1)(stylus@0.57.0)
vue-tsc:
- specifier: ^2.0.19
- version: 2.0.26(typescript@5.5.3)
+ specifier: ^2.0.29
+ version: 2.1.8(typescript@5.6.3)
windicss:
specifier: ^3.5.6
version: 3.5.6
@@ -157,20 +154,20 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
- '@antfu/eslint-config@2.23.0':
- resolution: {integrity: sha512-+ibN5QHV78JFWRa+Y9ttHj75d8zOb0NQjWXWeRlVwr1+WSns8UnEPd40dqzzUXq0D76FJ9gkMAlzKeEyfubkTQ==}
+ '@antfu/eslint-config@3.8.0':
+ resolution: {integrity: sha512-O5QSufPHpKTm0wk1OQ5c2mOZVzCqYV3hIDrt5zt+cOWqiG8YXLPkSOD4fFwjomATtOuUbcLUwkcgY5dErM7aIw==}
hasBin: true
peerDependencies:
'@eslint-react/eslint-plugin': ^1.5.8
'@prettier/plugin-xml': ^3.4.1
'@unocss/eslint-plugin': '>=0.50.0'
astro-eslint-parser: ^1.0.2
- eslint: '>=8.40.0'
+ eslint: ^9.10.0
eslint-plugin-astro: ^1.2.0
eslint-plugin-format: '>=0.1.0'
- eslint-plugin-react-hooks: ^4.6.0
+ eslint-plugin-react-hooks: ^5.0.0
eslint-plugin-react-refresh: ^0.4.4
- eslint-plugin-solid: ^0.13.2
+ eslint-plugin-solid: ^0.14.3
eslint-plugin-svelte: '>=2.35.1'
prettier-plugin-astro: ^0.13.0
prettier-plugin-slidev: ^1.0.5
@@ -203,137 +200,94 @@ packages:
svelte-eslint-parser:
optional: true
- '@antfu/eslint-plugin-unused-imports@4.0.0':
- resolution: {integrity: sha512-bvM3EnoradE3WbdOWafEGj0VzTi455gWvjmIHsmpWoIHJ6XehjnJh8Dq3+sz8t3bh14LQyFBKTx3m24q2zE1dw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- '@typescript-eslint/eslint-plugin': ^8.0.0-0
- eslint: ^9.0.0
- peerDependenciesMeta:
- '@typescript-eslint/eslint-plugin':
- optional: true
-
- '@antfu/install-pkg@0.3.3':
- resolution: {integrity: sha512-nHHsk3NXQ6xkCfiRRC8Nfrg8pU5kkr3P3Y9s9dKqiuRmBD0Yap7fymNDjGFKeWhZQHqqbCS5CfeMy9wtExM24w==}
+ '@antfu/install-pkg@0.4.1':
+ resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==}
'@antfu/utils@0.7.10':
resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
- '@babel/code-frame@7.24.7':
- resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
+ '@babel/code-frame@7.25.7':
+ resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==}
engines: {node: '>=6.9.0'}
- '@babel/compat-data@7.24.7':
- resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==}
+ '@babel/compat-data@7.25.7':
+ resolution: {integrity: sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==}
engines: {node: '>=6.9.0'}
- '@babel/compat-data@7.24.9':
- resolution: {integrity: sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==}
+ '@babel/core@7.25.7':
+ resolution: {integrity: sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==}
engines: {node: '>=6.9.0'}
- '@babel/core@7.24.7':
- resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==}
+ '@babel/generator@7.25.7':
+ resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==}
engines: {node: '>=6.9.0'}
- '@babel/core@7.24.9':
- resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==}
+ '@babel/helper-compilation-targets@7.25.7':
+ resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==}
engines: {node: '>=6.9.0'}
- '@babel/generator@7.24.10':
- resolution: {integrity: sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==}
+ '@babel/helper-module-imports@7.25.7':
+ resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-compilation-targets@7.24.7':
- resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-compilation-targets@7.24.8':
- resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-environment-visitor@7.24.7':
- resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-function-name@7.24.7':
- resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-hoist-variables@7.24.7':
- resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-imports@7.24.7':
- resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-transforms@7.24.7':
- resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==}
+ '@babel/helper-module-transforms@7.25.7':
+ resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-module-transforms@7.24.9':
- resolution: {integrity: sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-simple-access@7.24.7':
- resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
+ '@babel/helper-simple-access@7.25.7':
+ resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-split-export-declaration@7.24.7':
- resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
+ '@babel/helper-string-parser@7.25.7':
+ resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==}
engines: {node: '>=6.9.0'}
- '@babel/helper-string-parser@7.24.8':
- resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
+ '@babel/helper-validator-identifier@7.25.7':
+ resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.24.7':
- resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
+ '@babel/helper-validator-option@7.25.7':
+ resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-option@7.24.7':
- resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==}
+ '@babel/helpers@7.25.7':
+ resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-option@7.24.8':
- resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==}
+ '@babel/highlight@7.25.7':
+ resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==}
engines: {node: '>=6.9.0'}
- '@babel/helpers@7.24.7':
- resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helpers@7.24.8':
- resolution: {integrity: sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/highlight@7.24.7':
- resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.24.8':
- resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==}
+ '@babel/parser@7.25.7':
+ resolution: {integrity: sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==}
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/runtime@7.24.7':
- resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==}
+ '@babel/parser@7.25.8':
+ resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/runtime@7.25.7':
+ resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==}
engines: {node: '>=6.9.0'}
- '@babel/template@7.24.7':
- resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==}
+ '@babel/template@7.25.7':
+ resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==}
engines: {node: '>=6.9.0'}
- '@babel/traverse@7.24.8':
- resolution: {integrity: sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==}
+ '@babel/traverse@7.25.7':
+ resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==}
engines: {node: '>=6.9.0'}
- '@babel/types@7.24.9':
- resolution: {integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==}
+ '@babel/types@7.25.7':
+ resolution: {integrity: sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.25.8':
+ resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==}
engines: {node: '>=6.9.0'}
'@clack/core@0.3.4':
@@ -344,12 +298,12 @@ packages:
bundledDependencies:
- is-unicode-supported
- '@es-joy/jsdoccomment@0.43.1':
- resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==}
+ '@es-joy/jsdoccomment@0.48.0':
+ resolution: {integrity: sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==}
engines: {node: '>=16'}
- '@es-joy/jsdoccomment@0.46.0':
- resolution: {integrity: sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==}
+ '@es-joy/jsdoccomment@0.49.0':
+ resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==}
engines: {node: '>=16'}
'@esbuild/aix-ppc64@0.21.5':
@@ -490,38 +444,73 @@ packages:
cpu: [x64]
os: [win32]
+ '@eslint-community/eslint-plugin-eslint-comments@4.4.0':
+ resolution: {integrity: sha512-yljsWl5Qv3IkIRmJ38h3NrHXFCm4EUl55M8doGTF6hvzvFF8kRpextgSrg2dwHev9lzBZyafCr9RelGIyQm6fw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
+
'@eslint-community/eslint-utils@4.4.0':
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@eslint-community/regexpp@4.11.0':
- resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
+ '@eslint-community/regexpp@4.11.1':
+ resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
- '@eslint/config-array@0.17.0':
- resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==}
+ '@eslint/compat@1.2.1':
+ resolution: {integrity: sha512-JbHG2TWuCeNzh87fXo+/46Z1LEo9DBA9T188d0fZgGxAD+cNyS6sx9fdiyxjGPBMyQVRlCutTByZ6a5+YMkF7g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^9.10.0
+ peerDependenciesMeta:
+ eslint:
+ optional: true
+
+ '@eslint/config-array@0.18.0':
+ resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.7.0':
+ resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.1.0':
resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/js@9.7.0':
- resolution: {integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==}
+ '@eslint/js@9.13.0':
+ resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/markdown@6.2.1':
+ resolution: {integrity: sha512-cKVd110hG4ICHmWhIwZJfKmmJBvbiDWyrHODJknAtudKgZtlROGoLX9UEOA0o746zC0hCY4UV4vR+aOGW9S6JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.4':
resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@eslint/plugin-kit@0.2.1':
+ resolution: {integrity: sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@humanfs/core@0.19.0':
+ resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.5':
+ resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==}
+ engines: {node: '>=18.18.0'}
+
'@humanwhocodes/module-importer@1.0.1':
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
engines: {node: '>=12.22'}
- '@humanwhocodes/retry@0.3.0':
- resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==}
+ '@humanwhocodes/retry@0.3.1':
+ resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
engines: {node: '>=18.18'}
'@ianvs/prettier-plugin-sort-imports@4.3.1':
@@ -533,9 +522,9 @@ packages:
'@vue/compiler-sfc':
optional: true
- '@intlify/bundle-utils@8.0.0':
- resolution: {integrity: sha512-1B++zykRnMwQ+20SpsZI1JCnV/YJt9Oq7AGlEurzkWJOFtFAVqaGc/oV36PBRYeiKnTbY9VYfjBimr2Vt42wLQ==}
- engines: {node: '>= 14.16'}
+ '@intlify/bundle-utils@9.0.0-beta.0':
+ resolution: {integrity: sha512-xVaMrgbr60fYE1Jkq+k6grs2ZoXqh1EU71RVKkHkKh3KP7T6OYtG1Vbp1T09/jCUbv1GBd8Ir5WdZDyN+e8BpQ==}
+ engines: {node: '>= 18'}
peerDependencies:
petite-vue-i18n: '*'
vue-i18n: '*'
@@ -545,8 +534,12 @@ packages:
vue-i18n:
optional: true
- '@intlify/core-base@9.13.1':
- resolution: {integrity: sha512-+bcQRkJO9pcX8d0gel9ZNfrzU22sZFSA0WVhfXrf5jdJOS24a+Bp8pozuS9sBI9Hk/tGz83pgKfmqcn/Ci7/8w==}
+ '@intlify/core-base@10.0.4':
+ resolution: {integrity: sha512-GG428DkrrWCMhxRMRQZjuS7zmSUzarYcaHJqG9VB8dXAxw4iQDoKVQ7ChJRB6ZtsCsX3Jse1PEUlHrJiyQrOTg==}
+ engines: {node: '>= 16'}
+
+ '@intlify/core-base@9.14.1':
+ resolution: {integrity: sha512-rG5/hlNW6Qfve41go37szEf0mVLcfhYuOu83JcY0jZKasnwsrcZYYWDzebCcuO5I/6Sy1JFWo9p+nvkQS1Dy+w==}
engines: {node: '>= 16'}
'@intlify/eslint-plugin-vue-i18n@3.0.0':
@@ -555,27 +548,59 @@ packages:
peerDependencies:
eslint: ^8.0.0 || ^9.0.0-0
- '@intlify/message-compiler@9.13.1':
- resolution: {integrity: sha512-SKsVa4ajYGBVm7sHMXd5qX70O2XXjm55zdZB3VeMFCvQyvLew/dLvq3MqnaIsTMF1VkkOb9Ttr6tHcMlyPDL9w==}
+ '@intlify/message-compiler@10.0.0':
+ resolution: {integrity: sha512-OcaWc63NC/9p1cMdgoNKBj4d61BH8sUW1Hfs6YijTd9656ZR4rNqXAlRnBrfS5ABq0vjQjpa8VnyvH9hK49yBw==}
engines: {node: '>= 16'}
- '@intlify/shared@9.13.1':
- resolution: {integrity: sha512-u3b6BKGhE6j/JeRU6C/RL2FgyJfy6LakbtfeVF8fJXURpZZTzfh3e05J0bu0XPw447Q6/WUp3C4ajv4TMS4YsQ==}
+ '@intlify/message-compiler@10.0.4':
+ resolution: {integrity: sha512-AFbhEo10DP095/45EauinQJ5hJ3rJUmuuqltGguvc3WsvezZN+g8qNHLGWKu60FHQVizMrQY7VJ+zVlBXlQQkQ==}
engines: {node: '>= 16'}
- '@intlify/unplugin-vue-i18n@4.0.0':
- resolution: {integrity: sha512-q2Mhqa/mLi0tulfLFO4fMXXvEbkSZpI5yGhNNsLTNJJ41icEGUuyDe+j5zRZIKSkOJRgX6YbCyibTDJdRsukmw==}
- engines: {node: '>= 14.16'}
+ '@intlify/message-compiler@9.14.1':
+ resolution: {integrity: sha512-MY8hwukJBnXvGAncVKlHsqKDQ5ZcQx4peqEmI8wBUTXn4pezrtTGYXNoz81cLyEEHB+L/zlKWVBSh5TiX4gYoQ==}
+ engines: {node: '>= 16'}
+
+ '@intlify/shared@10.0.0':
+ resolution: {integrity: sha512-6ngLfI7DOTew2dcF9WMJx+NnMWghMBhIiHbGg+wRvngpzD5KZJZiJVuzMsUQE1a5YebEmtpTEfUrDp/NqVGdiw==}
+ engines: {node: '>= 16'}
+
+ '@intlify/shared@10.0.4':
+ resolution: {integrity: sha512-ukFn0I01HsSgr3VYhYcvkTCLS7rGa0gw4A4AMpcy/A9xx/zRJy7PS2BElMXLwUazVFMAr5zuiTk3MQeoeGXaJg==}
+ engines: {node: '>= 16'}
+
+ '@intlify/shared@9.14.1':
+ resolution: {integrity: sha512-XjHu6PEQup9MnP1x0W9y0nXXfq9jFftAYSfV11hryjtH4XqXP8HrzMvXI+ZVifF+jZLszaTzIhvukllplxTQTg==}
+ engines: {node: '>= 16'}
+
+ '@intlify/unplugin-vue-i18n@5.2.0':
+ resolution: {integrity: sha512-pmRiPY2Nj9mmSrixT69aO45XxGUr5fDBy/IIw4ajLlDTJm5TSmQKA5YNdsH0uxVDCPWy5tlQrF18hkDwI7UJvg==}
+ engines: {node: '>= 18'}
peerDependencies:
petite-vue-i18n: '*'
+ vue: ^3.2.25
vue-i18n: '*'
- vue-i18n-bridge: '*'
peerDependenciesMeta:
petite-vue-i18n:
optional: true
vue-i18n:
optional: true
- vue-i18n-bridge:
+
+ '@intlify/vue-i18n-extensions@7.0.0':
+ resolution: {integrity: sha512-MtvfJnb4aklpCU5Q/dkWkBT/vGsp3qERiPIwtTq5lX4PCLHtUprAJZp8wQj5ZcwDaFCU7+yVMjYbeXpIf927cA==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ '@intlify/shared': ^9.0.0 || ^10.0.0
+ '@vue/compiler-dom': ^3.0.0
+ vue: ^3.0.0
+ vue-i18n: ^9.0.0 || ^10.0.0
+ peerDependenciesMeta:
+ '@intlify/shared':
+ optional: true
+ '@vue/compiler-dom':
+ optional: true
+ vue:
+ optional: true
+ vue-i18n:
optional: true
'@isaacs/cliui@8.0.2':
@@ -600,12 +625,8 @@ packages:
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
- '@jsdevtools/ez-spawn@3.0.4':
- resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==}
- engines: {node: '>=10'}
-
- '@kyvg/vue3-notification@3.2.1':
- resolution: {integrity: sha512-qn4bCBBCxW0Ya+RmHXu2SYBVwGXWsAGdlDKqCqyLryaZTbtFXi32iSSLnuKjSUVxFqQRToFc6g1zp1XLTyHrvw==}
+ '@kyvg/vue3-notification@3.4.0':
+ resolution: {integrity: sha512-SFa5jPMVySj118LVGMFkPLpZVfFpLR/aTXJM90paS2LJZpwFqJnh9asJYPZ+wfJc1kXm3aOlluLoGw1OP4BnoA==}
peerDependencies:
vue: ^3.0.0
@@ -635,8 +656,8 @@ packages:
resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
- '@rollup/pluginutils@5.1.0':
- resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
+ '@rollup/pluginutils@5.1.2':
+ resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
@@ -644,118 +665,92 @@ packages:
rollup:
optional: true
- '@rollup/rollup-android-arm-eabi@4.18.1':
- resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==}
+ '@rollup/rollup-android-arm-eabi@4.24.0':
+ resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.18.1':
- resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==}
+ '@rollup/rollup-android-arm64@4.24.0':
+ resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.18.1':
- resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==}
+ '@rollup/rollup-darwin-arm64@4.24.0':
+ resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.18.1':
- resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==}
+ '@rollup/rollup-darwin-x64@4.24.0':
+ resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-linux-arm-gnueabihf@4.18.1':
- resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.24.0':
+ resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.18.1':
- resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==}
+ '@rollup/rollup-linux-arm-musleabihf@4.24.0':
+ resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.18.1':
- resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==}
+ '@rollup/rollup-linux-arm64-gnu@4.24.0':
+ resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.18.1':
- resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==}
+ '@rollup/rollup-linux-arm64-musl@4.24.0':
+ resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-powerpc64le-gnu@4.18.1':
- resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==}
+ '@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
+ resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==}
cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-riscv64-gnu@4.18.1':
- resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==}
+ '@rollup/rollup-linux-riscv64-gnu@4.24.0':
+ resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-s390x-gnu@4.18.1':
- resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==}
+ '@rollup/rollup-linux-s390x-gnu@4.24.0':
+ resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==}
cpu: [s390x]
os: [linux]
- '@rollup/rollup-linux-x64-gnu@4.18.1':
- resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==}
+ '@rollup/rollup-linux-x64-gnu@4.24.0':
+ resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-linux-x64-musl@4.18.1':
- resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==}
+ '@rollup/rollup-linux-x64-musl@4.24.0':
+ resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-win32-arm64-msvc@4.18.1':
- resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==}
+ '@rollup/rollup-win32-arm64-msvc@4.24.0':
+ resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.18.1':
- resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==}
+ '@rollup/rollup-win32-ia32-msvc@4.24.0':
+ resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.18.1':
- resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==}
+ '@rollup/rollup-win32-x64-msvc@4.24.0':
+ resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==}
cpu: [x64]
os: [win32]
- '@rtsao/scc@1.1.0':
- resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
-
'@sindresorhus/is@4.6.0':
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
engines: {node: '>=10'}
- '@stylistic/eslint-plugin-js@2.6.0-beta.0':
- resolution: {integrity: sha512-KQiNvzNzvl9AmMs1MiIBszLIy/Xy1bTExnyaVy5dSzOF9c+yT64JQfH0p0jP6XpGwoCnZsrPUNflwP30G42QBQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: '>=8.40.0'
-
- '@stylistic/eslint-plugin-jsx@2.6.0-beta.0':
- resolution: {integrity: sha512-TOimEpr3vndXHRhuQ5gMqmJv1SBlFI3poIJzyeNMmXi3NWVHoPxfd4QAJHGNJe5G3EO2NAXGf2H7nl8gY5QaZA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: '>=8.40.0'
-
- '@stylistic/eslint-plugin-plus@2.6.0-beta.0':
- resolution: {integrity: sha512-Wp+e4sTbFq0Uk5ncU3PETYfg1IcCZ1KycdlqFYXIA7/bgcieeShXouXUcA+S/S5+gWLXGuVJ12IxNzY8yfe4IA==}
- peerDependencies:
- eslint: '*'
-
- '@stylistic/eslint-plugin-ts@2.6.0-beta.0':
- resolution: {integrity: sha512-WMz1zgmMC3bvg1L/tiYt5ygvDbTDKlbezoHoX2lV9MnUCAEQZUP4xJ9Wj3jmIKxb4mUuK5+vFZJVcOygvbbqow==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: '>=8.40.0'
-
- '@stylistic/eslint-plugin@2.6.0-beta.0':
- resolution: {integrity: sha512-1NJy1iIDSFC4gelDJ82VMTq9J32tNvQ9k1lnxOsipZ0YQB826U5zGLiH37QAM8dRfNY6yeYhjlrUVtZUxFR19w==}
+ '@stylistic/eslint-plugin@2.9.0':
+ resolution: {integrity: sha512-OrDyFAYjBT61122MIY1a3SfEgy3YCMgt2vL4eoPmvTwDBwyQhAXurxNQznlRD/jESNfYWfID8Ej+31LljvF7Xg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: '>=8.40.0'
@@ -764,32 +759,38 @@ packages:
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
- '@types/eslint@8.56.10':
- resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==}
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
'@types/eslint__js@8.42.3':
resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==}
- '@types/estree@1.0.5':
- resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
- '@types/lodash@4.17.7':
- resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==}
+ '@types/lodash@4.17.12':
+ resolution: {integrity: sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==}
- '@types/mdast@3.0.15':
- resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
- '@types/node@20.14.11':
- resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==}
+ '@types/ms@0.7.34':
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+
+ '@types/node@20.17.1':
+ resolution: {integrity: sha512-j2VlPv1NnwPJbaCNv69FO/1z4lId0QmGvpT41YxitRtWlg96g/j8qcv2RKsLKe2F6OJgyXhupN1Xo17b2m139Q==}
'@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
- '@types/prismjs@1.26.4':
- resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==}
+ '@types/prismjs@1.26.5':
+ resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==}
'@types/semver@7.5.8':
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
@@ -797,25 +798,14 @@ packages:
'@types/tinycolor2@1.4.6':
resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==}
- '@types/unist@2.0.10':
- resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
'@types/web-bluetooth@0.0.20':
resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
- '@typescript-eslint/eslint-plugin@7.16.1':
- resolution: {integrity: sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- '@typescript-eslint/parser': ^7.0.0
- eslint: ^8.56.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/eslint-plugin@8.0.0-alpha.40':
- resolution: {integrity: sha512-yku4NjpP0UujYq8d1GWXYELpKYwuoESSgvXPd9uAiO24OszGxQhPsGWTe4fmZV05J47qILfaGANO9SCa9fEU0w==}
+ '@typescript-eslint/eslint-plugin@8.10.0':
+ resolution: {integrity: sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@@ -825,18 +815,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/parser@7.16.1':
- resolution: {integrity: sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- eslint: ^8.56.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/parser@8.0.0-alpha.40':
- resolution: {integrity: sha512-cjIgiaxmGtjlA6rRSs0Gsh0mWR08kPv1W+HsrZcuFwWxoGavBZPKtNctXND0NVf6MgSKyIcd4AHqBwE0htp5uw==}
+ '@typescript-eslint/parser@8.10.0':
+ resolution: {integrity: sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -845,30 +825,16 @@ packages:
typescript:
optional: true
- '@typescript-eslint/scope-manager@7.16.1':
- resolution: {integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==}
+ '@typescript-eslint/scope-manager@7.18.0':
+ resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/scope-manager@8.0.0-alpha.40':
- resolution: {integrity: sha512-KQL502sCGZW+dYvxIzF6rEozbgppN0mBkYV6kT8ciY5OtFIRlLDTP7NdVAMMDk7q35T7Ad8negaQ9AGpZ8+Y5w==}
+ '@typescript-eslint/scope-manager@8.10.0':
+ resolution: {integrity: sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/scope-manager@8.0.0-alpha.45':
- resolution: {integrity: sha512-zmfZYLH6Oaq1drf99idktn1/m4SZvBXFUKdl8B2A1SrBc6E57wtRW9OwFBnROgM4gHeG1wb89DLhQ/UeqcUmMQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
- '@typescript-eslint/type-utils@7.16.1':
- resolution: {integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- eslint: ^8.56.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/type-utils@8.0.0-alpha.40':
- resolution: {integrity: sha512-/Aynkgxy3x22i6Zxy73MR/r0y1OELOMC9Atn7MO97NsjBOrQQYJHi/UEklZ423aB8SCkYH34lO6EAzXX/lIN3g==}
+ '@typescript-eslint/type-utils@8.10.0':
+ resolution: {integrity: sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@@ -876,20 +842,16 @@ packages:
typescript:
optional: true
- '@typescript-eslint/types@7.16.1':
- resolution: {integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==}
+ '@typescript-eslint/types@7.18.0':
+ resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/types@8.0.0-alpha.40':
- resolution: {integrity: sha512-44mUq4VZVydxNlOM8Xtp/BXDkyfuvvjgPIBf7vRQDutrLDeNS0pJ9pcSloSbop5MwKLfJjBU+PbwnJPQM+DWNg==}
+ '@typescript-eslint/types@8.10.0':
+ resolution: {integrity: sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/types@8.0.0-alpha.45':
- resolution: {integrity: sha512-yjTlmcSnkFV8IoqE0vinmWo+fl7TjkaGyGX/g9gKN/b2IO8g+AimB7BhilmlBqvZupvo2AfiHqcnZEVhQAXI8w==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
- '@typescript-eslint/typescript-estree@7.16.1':
- resolution: {integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==}
+ '@typescript-eslint/typescript-estree@7.18.0':
+ resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==}
engines: {node: ^18.18.0 || >=20.0.0}
peerDependencies:
typescript: '*'
@@ -897,8 +859,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/typescript-estree@8.0.0-alpha.40':
- resolution: {integrity: sha512-bz1rX5GXvGdx686FghDxPqGwgntlseZCQSRrVGDDOZlLSoWJnbfkzxXGOWch9c3ttcGkdFy/DiCyKKga3hrq0g==}
+ '@typescript-eslint/typescript-estree@8.10.0':
+ resolution: {integrity: sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@@ -906,130 +868,133 @@ packages:
typescript:
optional: true
- '@typescript-eslint/typescript-estree@8.0.0-alpha.45':
- resolution: {integrity: sha512-FcvtdTxahvP+qlZ1XXF+m0GVqomklKtkG6cIHLdBvTOHgIBILtahU7yyRE5rOHDdGoAFu8AzItJI12rtf9TRyA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/utils@7.16.1':
- resolution: {integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- eslint: ^8.56.0
-
- '@typescript-eslint/utils@8.0.0-alpha.40':
- resolution: {integrity: sha512-ijxO1Hs3YWveuWK+Vbt25D05Q41UeK08JwEJbWTzV38LmkdCBktQd7X1sTw4W9Qku692HWuHgesZf6OhC8t3aA==}
+ '@typescript-eslint/utils@8.10.0':
+ resolution: {integrity: sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
- '@typescript-eslint/utils@8.0.0-alpha.45':
- resolution: {integrity: sha512-5YVHji5bovAKsDdT3mV7vjDEUhPJvmsh7LXY+/ixHyZJDE52TmsobBGSEBmijeqYWfz2vuNJyyvFGJTo70UikA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: ^8.57.0 || ^9.0.0
-
- '@typescript-eslint/visitor-keys@7.16.1':
- resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==}
+ '@typescript-eslint/visitor-keys@7.18.0':
+ resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/visitor-keys@8.0.0-alpha.40':
- resolution: {integrity: sha512-y1stojSPb5D3M8VlGGpaiBU5XxGLe+sPuW0YbLe09Lxvo4AwKGvhAr5lhqJZo4z6qHNz385+6+BS63+qIQdYLw==}
+ '@typescript-eslint/visitor-keys@8.10.0':
+ resolution: {integrity: sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/visitor-keys@8.0.0-alpha.45':
- resolution: {integrity: sha512-SZmtknee9MzeT41tCpvh5vUyji0Zr4OyfERJqDmfg5YZwkm3BRdTeexrBKK9C8da97ULR1SUSeLUTqttC77vJw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
- '@vitejs/plugin-vue@5.0.5':
- resolution: {integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==}
+ '@vitejs/plugin-vue@5.1.4':
+ resolution: {integrity: sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
vite: ^5.0.0
vue: ^3.2.25
- '@vitest/expect@2.0.3':
- resolution: {integrity: sha512-X6AepoOYePM0lDNUPsGXTxgXZAl3EXd0GYe/MZyVE4HzkUqyUVC6S3PrY5mClDJ6/7/7vALLMV3+xD/Ko60Hqg==}
+ '@vitest/eslint-plugin@1.1.7':
+ resolution: {integrity: sha512-pTWGW3y6lH2ukCuuffpan6kFxG6nIuoesbhMiQxskyQMRcCN5t9SXsKrNHvEw3p8wcCsgJoRqFZVkOTn6TjclA==}
+ peerDependencies:
+ '@typescript-eslint/utils': '>= 8.0'
+ eslint: '>= 8.57.0'
+ typescript: '>= 5.0.0'
+ vitest: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ vitest:
+ optional: true
- '@vitest/pretty-format@2.0.3':
- resolution: {integrity: sha512-URM4GLsB2xD37nnTyvf6kfObFafxmycCL8un3OC9gaCs5cti2u+5rJdIflZ2fUJUen4NbvF6jCufwViAFLvz1g==}
+ '@vitest/expect@2.1.3':
+ resolution: {integrity: sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==}
- '@vitest/runner@2.0.3':
- resolution: {integrity: sha512-EmSP4mcjYhAcuBWwqgpjR3FYVeiA4ROzRunqKltWjBfLNs1tnMLtF+qtgd5ClTwkDP6/DGlKJTNa6WxNK0bNYQ==}
+ '@vitest/mocker@2.1.3':
+ resolution: {integrity: sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==}
+ peerDependencies:
+ '@vitest/spy': 2.1.3
+ msw: ^2.3.5
+ vite: ^5.0.0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
- '@vitest/snapshot@2.0.3':
- resolution: {integrity: sha512-6OyA6v65Oe3tTzoSuRPcU6kh9m+mPL1vQ2jDlPdn9IQoUxl8rXhBnfICNOC+vwxWY684Vt5UPgtcA2aPFBb6wg==}
+ '@vitest/pretty-format@2.1.3':
+ resolution: {integrity: sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==}
- '@vitest/spy@2.0.3':
- resolution: {integrity: sha512-sfqyAw/ypOXlaj4S+w8689qKM1OyPOqnonqOc9T91DsoHbfN5mU7FdifWWv3MtQFf0lEUstEwR9L/q/M390C+A==}
+ '@vitest/runner@2.1.3':
+ resolution: {integrity: sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==}
- '@vitest/utils@2.0.3':
- resolution: {integrity: sha512-c/UdELMuHitQbbc/EVctlBaxoYAwQPQdSNwv7z/vHyBKy2edYZaFgptE27BRueZB7eW8po+cllotMNTDpL3HWg==}
+ '@vitest/snapshot@2.1.3':
+ resolution: {integrity: sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==}
- '@volar/language-core@2.4.0-alpha.15':
- resolution: {integrity: sha512-mt8z4Fm2WxfQYoQHPcKVjLQV6PgPqyKLbkCVY2cr5RSaamqCHjhKEpsFX66aL4D/7oYguuaUw9Bx03Vt0TpIIA==}
+ '@vitest/spy@2.1.3':
+ resolution: {integrity: sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==}
- '@volar/source-map@2.4.0-alpha.15':
- resolution: {integrity: sha512-8Htngw5TmBY4L3ClDqBGyfLhsB8EmoEXUH1xydyEtEoK0O6NX5ur4Jw8jgvscTlwzizyl/wsN1vn0cQXVbbXYg==}
+ '@vitest/utils@2.1.3':
+ resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==}
- '@volar/typescript@2.4.0-alpha.15':
- resolution: {integrity: sha512-U3StRBbDuxV6Woa4hvGS4kz3XcOzrWUKgFdEFN+ba1x3eaYg7+ytau8ul05xgA+UNGLXXsKur7fTUhDFyISk0w==}
+ '@volar/language-core@2.4.8':
+ resolution: {integrity: sha512-K/GxMOXGq997bO00cdFhTNuR85xPxj0BEEAy+BaqqayTmy9Tmhfgmq2wpJcVspRhcwfgPoE2/mEJa26emUhG/g==}
- '@vue/compiler-core@3.4.32':
- resolution: {integrity: sha512-8tCVWkkLe/QCWIsrIvExUGnhYCAOroUs5dzhSoKL5w4MJS8uIYiou+pOPSVIOALOQ80B0jBs+Ri+kd5+MBnCDw==}
+ '@volar/source-map@2.4.8':
+ resolution: {integrity: sha512-jeWJBkC/WivdelMwxKkpFL811uH/jJ1kVxa+c7OvG48DXc3VrP7pplSWPP2W1dLMqBxD+awRlg55FQQfiup4cA==}
- '@vue/compiler-dom@3.4.32':
- resolution: {integrity: sha512-PbSgt9KuYo4fyb90dynuPc0XFTfFPs3sCTbPLOLlo+PrUESW1gn/NjSsUvhR+mI2AmmEzexwYMxbHDldxSOr2A==}
+ '@volar/typescript@2.4.8':
+ resolution: {integrity: sha512-6xkIYJ5xxghVBhVywMoPMidDDAFT1OoQeXwa27HSgJ6AiIKRe61RXLoik+14Z7r0JvnblXVsjsRLmCr42SGzqg==}
- '@vue/compiler-sfc@3.4.32':
- resolution: {integrity: sha512-STy9im/WHfaguJnfKjjVpMHukxHUrOKjm2vVCxiojQJyo3Sb6Os8SMXBr/MI+ekpstEGkDONfqAQoSbZhspLYw==}
+ '@vue/compiler-core@3.5.12':
+ resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==}
- '@vue/compiler-ssr@3.4.32':
- resolution: {integrity: sha512-nyu/txTecF6DrxLrpLcI34xutrvZPtHPBj9yRoPxstIquxeeyywXpYZrQMsIeDfBhlw1abJb9CbbyZvDw2kjdg==}
+ '@vue/compiler-dom@3.5.12':
+ resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==}
- '@vue/devtools-api@6.6.3':
- resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==}
+ '@vue/compiler-sfc@3.5.12':
+ resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==}
- '@vue/language-core@2.0.26':
- resolution: {integrity: sha512-/lt6SfQ3O1yDAhPsnLv9iSUgXd1dMHqUm/t3RctfqjuwQf1LnftZ414X3UBn6aXT4MiwXWtbNJ4Z0NZWwDWgJQ==}
+ '@vue/compiler-ssr@3.5.12':
+ resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==}
+
+ '@vue/compiler-vue2@2.7.16':
+ resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
+
+ '@vue/devtools-api@6.6.4':
+ resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+ '@vue/language-core@2.1.8':
+ resolution: {integrity: sha512-DtPUKrIRqqzY1joGfVHxHWZoxXZbCQLmVtW+QTifuPInfcs1R/3UAdlJXDp+lpSpP9lI5m+jMYYlwDXXu3KSTg==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
- '@vue/reactivity@3.4.32':
- resolution: {integrity: sha512-1P7QvghAzhSIWmiNmh4MNkLVjr2QTNDcFv2sKmytEWhR6t7BZzNicgm5ENER4uU++wbWxgRh/pSEYgdI3MDcvg==}
+ '@vue/reactivity@3.5.12':
+ resolution: {integrity: sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==}
- '@vue/runtime-core@3.4.32':
- resolution: {integrity: sha512-FxT2dTHUs1Hki8Ui/B1Hu339mx4H5kRJooqrNM32tGUHBPStJxwMzLIRbeGO/B1NMplU4Pg9fwOqrJtrOzkdfA==}
+ '@vue/runtime-core@3.5.12':
+ resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==}
- '@vue/runtime-dom@3.4.32':
- resolution: {integrity: sha512-Xz9G+ZViRyPFQtRBCPFkhMzKn454ihCPMKUiacNaUhuTIXvyfkAq8l89IZ/kegFVyw/7KkJGRGqYdEZrf27Xsg==}
+ '@vue/runtime-dom@3.5.12':
+ resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==}
- '@vue/server-renderer@3.4.32':
- resolution: {integrity: sha512-3c4rd0522Ao8hKjzgmUAbcjv2mBnvnw0Ld2f8HOMCuWJZjYie/p8cpIoYJbeP0VV2JYmrJJMwGQDO5RH4iQ30A==}
+ '@vue/server-renderer@3.5.12':
+ resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==}
peerDependencies:
- vue: 3.4.32
+ vue: 3.5.12
- '@vue/shared@3.4.32':
- resolution: {integrity: sha512-ep4mF1IVnX/pYaNwxwOpJHyBtOMKWoKZMbnUyd+z0udqIxLUh7YCCd/JfDna8aUrmnG9SFORyIq2HzEATRrQsg==}
+ '@vue/shared@3.5.12':
+ resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==}
'@vue/test-utils@2.4.6':
resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==}
- '@vueuse/core@10.11.0':
- resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==}
+ '@vueuse/core@11.1.0':
+ resolution: {integrity: sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg==}
- '@vueuse/metadata@10.11.0':
- resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==}
+ '@vueuse/metadata@11.1.0':
+ resolution: {integrity: sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg==}
- '@vueuse/shared@10.11.0':
- resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==}
+ '@vueuse/shared@11.1.0':
+ resolution: {integrity: sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==}
'@windicss/config@1.9.3':
resolution: {integrity: sha512-u8GUjsfC9r5X1AGYhzb1lX3zZj8wqk6SH1DYex8XUGmZ1M2UpvnUPOFi63XFViduspQ6l2xTX84QtG+lUzhEoQ==}
@@ -1046,8 +1011,8 @@ packages:
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- acorn@8.12.1:
- resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
+ acorn@8.13.0:
+ resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==}
engines: {node: '>=0.4.0'}
hasBin: true
@@ -1058,12 +1023,15 @@ packages:
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ alien-signals@0.2.0:
+ resolution: {integrity: sha512-StlonZhBBrsPPwrDjiPAiVTf/rolxffLxVPT60Qv/t88BZ81BvUVzHgGqEFvJ1ii8HXtm1+zU2Icr59tfWEcag==}
+
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
- ansi-regex@6.0.1:
- resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
engines: {node: '>=12'}
ansi-styles@3.2.1:
@@ -1081,10 +1049,6 @@ packages:
ansi_up@6.0.2:
resolution: {integrity: sha512-3G3vKvl1ilEp7J1u6BmULpMA0xVoW/f4Ekqhl8RTrJrhEBkonKn5k3bUc5Xt+qDayA6iDX0jyUh3AbZjB/l0tw==}
- anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
-
are-docs-informative@0.0.2:
resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==}
engines: {node: '>=14'}
@@ -1116,10 +1080,6 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- binary-extensions@2.3.0:
- resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
- engines: {node: '>=8'}
-
boolbase@1.0.0:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
@@ -1133,13 +1093,8 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browserslist@4.23.1:
- resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
- browserslist@4.23.2:
- resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==}
+ browserslist@4.24.0:
+ resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
@@ -1151,18 +1106,15 @@ packages:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
- call-me-maybe@1.0.2:
- resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==}
-
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
- caniuse-lite@1.0.30001640:
- resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==}
+ caniuse-lite@1.0.30001667:
+ resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==}
- caniuse-lite@1.0.30001642:
- resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==}
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
chai@5.1.1:
resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==}
@@ -1184,23 +1136,13 @@ packages:
resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
engines: {node: '>=10'}
- character-entities-legacy@1.1.4:
- resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
-
- character-entities@1.2.4:
- resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
-
- character-reference-invalid@1.1.4:
- resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
check-error@2.1.1:
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
engines: {node: '>= 16'}
- chokidar@3.6.0:
- resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
- engines: {node: '>= 8.10.0'}
-
ci-info@4.0.0:
resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==}
engines: {node: '>=8'}
@@ -1242,14 +1184,11 @@ packages:
resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==}
engines: {node: '>= 12.0.0'}
- computeds@0.0.1:
- resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==}
-
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
- confbox@0.1.7:
- resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==}
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
config-chain@1.1.13:
resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
@@ -1257,8 +1196,8 @@ packages:
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
- core-js-compat@3.37.1:
- resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==}
+ core-js-compat@3.38.1:
+ resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==}
cross-spawn@7.0.3:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
@@ -1291,8 +1230,8 @@ packages:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
- cssstyle@4.0.1:
- resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==}
+ cssstyle@4.1.0:
+ resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==}
engines: {node: '>=18'}
csstype@3.1.3:
@@ -1302,8 +1241,8 @@ packages:
resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
engines: {node: '>=18'}
- dayjs@1.11.12:
- resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==}
+ dayjs@1.11.13:
+ resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
@@ -1316,8 +1255,8 @@ packages:
supports-color:
optional: true
- debug@4.3.5:
- resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
@@ -1328,6 +1267,9 @@ packages:
decimal.js@10.4.3:
resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
+ decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+
decode-uri-component@0.2.2:
resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
engines: {node: '>=0.10'}
@@ -1343,6 +1285,13 @@ packages:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
dir-glob@3.0.1:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
@@ -1372,11 +1321,8 @@ packages:
engines: {node: '>=14'}
hasBin: true
- electron-to-chromium@1.4.817:
- resolution: {integrity: sha512-3znu+lZMIbTe8ZOs360OMJvVroVF2NpNI8T5jfLnDetVvj0uNmIucZzQVYMSJfsu9f47Ssox1Gt46PR+R+1JUg==}
-
- electron-to-chromium@1.4.829:
- resolution: {integrity: sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==}
+ electron-to-chromium@1.5.32:
+ resolution: {integrity: sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -1387,8 +1333,8 @@ packages:
emojilib@2.4.0:
resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==}
- enhanced-resolve@5.17.0:
- resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==}
+ enhanced-resolve@5.17.1:
+ resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==}
engines: {node: '>=10.13.0'}
entities@4.5.0:
@@ -1406,8 +1352,8 @@ packages:
engines: {node: '>=12'}
hasBin: true
- escalade@3.1.2:
- resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
escape-string-regexp@1.0.5:
@@ -1418,6 +1364,10 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
+ escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+
escodegen@2.1.0:
resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
engines: {node: '>=6.0'}
@@ -1429,11 +1379,13 @@ packages:
peerDependencies:
eslint: '>=6.0.0'
- eslint-config-flat-gitignore@0.1.8:
- resolution: {integrity: sha512-OEUbS2wzzYtUfshjOqzFo4Bl4lHykXUdM08TCnYNl7ki+niW4Q1R0j0FDFDr0vjVsI5ZFOz5LvluxOP+Ew+dYw==}
+ eslint-config-flat-gitignore@0.3.0:
+ resolution: {integrity: sha512-0Ndxo4qGhcewjTzw52TK06Mc00aDtHNTdeeW2JfONgDcLkRO/n/BteMRzNVpLQYxdCC/dFEilfM9fjjpGIJ9Og==}
+ peerDependencies:
+ eslint: ^9.5.0
- eslint-flat-config-utils@0.2.5:
- resolution: {integrity: sha512-iO+yLZtC/LKgACerkpvsZ6NoRVB2sxT04mOpnNcEM1aTwKy+6TsT46PUvrML4y2uVBS6I67hRCd2JiKAPaL/Uw==}
+ eslint-flat-config-utils@0.4.0:
+ resolution: {integrity: sha512-kfd5kQZC+BMO0YwTol6zxjKX1zAsk8JfSAopbKjKqmENTJcew+yBejuvccAg37cvOrN0Mh+DVbeyznuNWEjt4A==}
eslint-import-resolver-node@0.3.9:
resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
@@ -1443,13 +1395,13 @@ packages:
peerDependencies:
eslint: '*'
- eslint-plugin-antfu@2.3.4:
- resolution: {integrity: sha512-5RIjJpBK1tuNHuLyFyZ90/iW9s439dP1u2cxA4dH70djx9sKq1CqI+O6Q95aVjgFNTDtQzSC9uYdAD5uEEKciQ==}
+ eslint-plugin-antfu@2.7.0:
+ resolution: {integrity: sha512-gZM3jq3ouqaoHmUNszb1Zo2Ux7RckSvkGksjLWz9ipBYGSv1EwwBETN6AdiUXn+RpVHXTbEMPAPlXJazcA6+iA==}
peerDependencies:
eslint: '*'
- eslint-plugin-command@0.2.3:
- resolution: {integrity: sha512-1bBYNfjZg60N2ZpLV5ATYSYyueIJ+zl5yKrTs0UFDdnyu07dNSZ7Xplnc+Wb6SXTdc1sIaoIrnuyhvztcltX6A==}
+ eslint-plugin-command@0.2.6:
+ resolution: {integrity: sha512-T0bHZ1oblW1xUHUVoBKZJR2osSNNGkfZuK4iqboNwuNS/M7tdp3pmURaJtTi/XDzitxaQ02lvOdFH0mUd5QLvQ==}
peerDependencies:
eslint: '*'
@@ -1459,20 +1411,14 @@ packages:
peerDependencies:
eslint: '>=8'
- eslint-plugin-eslint-comments@3.2.0:
- resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==}
- engines: {node: '>=6.5.0'}
+ eslint-plugin-import-x@4.3.1:
+ resolution: {integrity: sha512-5TriWkXulDl486XnYYRgsL+VQoS/7mhN/2ci02iLCuL7gdhbiWxnsuL/NTcaKY9fpMgsMFjWZBtIGW7pb+RX0g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- eslint: '>=4.19.1'
+ eslint: ^8.57.0 || ^9.0.0
- eslint-plugin-import-x@3.0.1:
- resolution: {integrity: sha512-jzQgJuE4ssxwNi0aMBkOL8whd4eHb0Z/uFWsk8uEoYB7xwTkAptSKojLzRswxgf/1bhH6QgcLjgabUBQqluBIg==}
- engines: {node: '>=16'}
- peerDependencies:
- eslint: ^8.56.0 || ^9.0.0-0
-
- eslint-plugin-jsdoc@48.7.0:
- resolution: {integrity: sha512-5oiVf7Y+ZxGYQTlLq81X72n+S+hjvS/u0upAdbpPEeaIZILK3MKN8lm/6QqKioBjm/qZ0B5XpMQUtc2fUkqXAg==}
+ eslint-plugin-jsdoc@50.4.3:
+ resolution: {integrity: sha512-uWtwFxGRv6B8sU63HZM5dAGDhgsatb+LONwmILZJhdRALLOkCX2HFZhdL/Kw2ls8SQMAVEfK+LmnEfxInRN8HA==}
engines: {node: '>=18'}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -1483,29 +1429,24 @@ packages:
peerDependencies:
eslint: '>=6.0.0'
- eslint-plugin-markdown@5.1.0:
- resolution: {integrity: sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: '>=8'
-
- eslint-plugin-n@17.9.0:
- resolution: {integrity: sha512-CPSaXDXdrT4nsrOrO4mT4VB6FMUkoySRkHWuuJJHVqsIEjIeZgMY1H7AzSwPbDScikBmLN82KeM1u7ixV7PzGg==}
+ eslint-plugin-n@17.11.1:
+ resolution: {integrity: sha512-93IUD82N6tIEgjztVI/l3ElHtC2wTa9boJHrD8iN+NyDxjxz/daZUZKfkedjBZNdg6EqDk4irybUsiPwDqXAEA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: '>=8.23.0'
- eslint-plugin-no-only-tests@3.1.0:
- resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==}
+ eslint-plugin-no-only-tests@3.3.0:
+ resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==}
engines: {node: '>=5.0.0'}
- eslint-plugin-perfectionist@2.11.0:
- resolution: {integrity: sha512-XrtBtiu5rbQv88gl+1e2RQud9te9luYNvKIgM9emttQ2zutHPzY/AQUucwxscDKV4qlTkvLTxjOFvxqeDpPorw==}
+ eslint-plugin-perfectionist@3.9.1:
+ resolution: {integrity: sha512-9WRzf6XaAxF4Oi5t/3TqKP5zUjERhasHmLFHin2Yw6ZAp/EP/EVA2dr3BhQrrHWCm5SzTMZf0FcjDnBkO2xFkA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
astro-eslint-parser: ^1.0.2
eslint: '>=8.0.0'
svelte: '>=3.0.0'
- svelte-eslint-parser: ^0.37.0
+ svelte-eslint-parser: ^0.41.1
vue-eslint-parser: '>=9.0.0'
peerDependenciesMeta:
astro-eslint-parser:
@@ -1517,9 +1458,9 @@ packages:
vue-eslint-parser:
optional: true
- eslint-plugin-promise@6.4.0:
- resolution: {integrity: sha512-/KWWRaD3fGkVCZsdR0RU53PSthFmoHVhZl+y9+6DqeDLSikLdlUVpVEAmI6iCRR5QyOjBYBqHZV/bdv4DJ4Gtw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ eslint-plugin-promise@7.1.0:
+ resolution: {integrity: sha512-8trNmPxdAy3W620WKDpaS65NlM5yAumod6XeC4LOb+jxlkG4IVcp68c6dXY2ev+uT4U1PtG57YDV6EGAXN0GbQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -1535,24 +1476,20 @@ packages:
peerDependencies:
eslint: '>=6.0.0'
- eslint-plugin-unicorn@54.0.0:
- resolution: {integrity: sha512-XxYLRiYtAWiAjPv6z4JREby1TAE2byBC7wlh0V4vWDCpccOSU1KovWV//jqPXF6bq3WKxqX9rdjoRQ1EhdmNdQ==}
+ eslint-plugin-unicorn@56.0.0:
+ resolution: {integrity: sha512-aXpddVz/PQMmd69uxO98PA4iidiVNvA0xOtbpUoz1WhBd4RxOQQYqN618v68drY0hmy5uU2jy1bheKEVWBjlPw==}
engines: {node: '>=18.18'}
peerDependencies:
eslint: '>=8.56.0'
- eslint-plugin-vitest@0.5.4:
- resolution: {integrity: sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==}
- engines: {node: ^18.0.0 || >= 20.0.0}
+ eslint-plugin-unused-imports@4.1.4:
+ resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==}
peerDependencies:
- '@typescript-eslint/eslint-plugin': '*'
- eslint: ^8.57.0 || ^9.0.0
- vitest: '*'
+ '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0
+ eslint: ^9.0.0 || ^8.0.0
peerDependenciesMeta:
'@typescript-eslint/eslint-plugin':
optional: true
- vitest:
- optional: true
eslint-plugin-vue-scoped-css@2.8.1:
resolution: {integrity: sha512-V6B+zZE60ykYvHTDzdhJ3xa4C83ntmGXqFsylc8l1jdVR9PSgod2+bGFNL7OwRKgZj82ij/o904xa04z1bfCRA==}
@@ -1561,8 +1498,8 @@ packages:
eslint: '>=5.0.0'
vue-eslint-parser: '>=7.1.0'
- eslint-plugin-vue@9.27.0:
- resolution: {integrity: sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==}
+ eslint-plugin-vue@9.29.0:
+ resolution: {integrity: sha512-hamyjrBhNH6Li6R1h1VF9KHfshJlKgKEg3ARbGTn72CMNDSMhWbgC7NdkRDEh25AFW+4SDATzyNM+3gWuZii8g==}
engines: {node: ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -1579,33 +1516,34 @@ packages:
'@vue/compiler-sfc': ^3.3.0
eslint: ^8.50.0 || ^9.0.0
- eslint-rule-composer@0.3.0:
- resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==}
- engines: {node: '>=4.0.0'}
-
eslint-scope@7.2.2:
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- eslint-scope@8.0.2:
- resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==}
+ eslint-scope@8.1.0:
+ resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- eslint-visitor-keys@4.0.0:
- resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==}
+ eslint-visitor-keys@4.1.0:
+ resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint@9.7.0:
- resolution: {integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==}
+ eslint@9.13.0:
+ resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
- espree@10.1.0:
- resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==}
+ espree@10.2.0:
+ resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
espree@9.6.1:
@@ -1639,10 +1577,6 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
- execa@8.0.1:
- resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
- engines: {node: '>=16.17'}
-
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -1689,8 +1623,8 @@ packages:
flatted@3.3.1:
resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
- foreground-child@3.2.1:
- resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==}
+ foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
engines: {node: '>=14'}
form-data@4.0.0:
@@ -1720,15 +1654,8 @@ packages:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
- get-func-name@2.0.2:
- resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
-
- get-stream@8.0.1:
- resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
- engines: {node: '>=16'}
-
- get-tsconfig@4.7.5:
- resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==}
+ get-tsconfig@4.8.1:
+ resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -1738,9 +1665,8 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
- glob@10.4.2:
- resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==}
- engines: {node: '>=16 || 14 >=14.18'}
+ glob@10.4.5:
+ resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
hasBin: true
glob@7.2.3:
@@ -1759,8 +1685,12 @@ packages:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
engines: {node: '>=18'}
- globals@15.8.0:
- resolution: {integrity: sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==}
+ globals@15.10.0:
+ resolution: {integrity: sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==}
+ engines: {node: '>=18'}
+
+ globals@15.11.0:
+ resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==}
engines: {node: '>=18'}
globby@11.1.0:
@@ -1804,16 +1734,12 @@ packages:
resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
engines: {node: '>= 14'}
- human-signals@5.0.0:
- resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
- engines: {node: '>=16.17.0'}
-
iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
- ignore@5.3.1:
- resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
import-fresh@3.3.0:
@@ -1838,30 +1764,17 @@ packages:
ini@1.3.8:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
- is-alphabetical@1.0.4:
- resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
-
- is-alphanumerical@1.0.4:
- resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
-
is-arrayish@0.2.1:
resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
- is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
-
is-builtin-module@3.2.1:
resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
engines: {node: '>=6'}
- is-core-module@2.15.0:
- resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==}
+ is-core-module@2.15.1:
+ resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
engines: {node: '>= 0.4'}
- is-decimal@1.0.4:
- resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
-
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
@@ -1874,9 +1787,6 @@ packages:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
- is-hexadecimal@1.0.4:
- resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
-
is-language-code@3.1.0:
resolution: {integrity: sha512-zJdQ3QTeLye+iphMeK3wks+vXSRFKh68/Pnlw7aOfApFSEIOhYa8P9vwwa6QrImNNBMJTiL1PpYF0f4BxDuEgA==}
@@ -1884,23 +1794,14 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
- is-path-inside@3.0.3:
- resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
- engines: {node: '>=8'}
-
is-potential-custom-element-name@1.0.1:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
- is-stream@3.0.0:
- resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- jackspeak@3.4.0:
- resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==}
- engines: {node: '>=14'}
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
jiti@1.21.6:
resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
@@ -1925,12 +1826,12 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
- jsdoc-type-pratt-parser@4.0.0:
- resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==}
+ jsdoc-type-pratt-parser@4.1.0:
+ resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
engines: {node: '>=12.0.0'}
- jsdom@24.1.0:
- resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==}
+ jsdom@25.0.1:
+ resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==}
engines: {node: '>=18'}
peerDependencies:
canvas: ^2.11.2
@@ -1942,11 +1843,6 @@ packages:
resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
hasBin: true
- jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
- hasBin: true
-
jsesc@3.0.2:
resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
engines: {node: '>=6'}
@@ -2007,24 +1903,56 @@ packages:
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
- loupe@3.1.1:
- resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==}
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
- lru-cache@10.3.0:
- resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==}
- engines: {node: 14 || >=16.14}
+ loupe@3.1.2:
+ resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- magic-string@0.30.10:
- resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
+ magic-string@0.30.12:
+ resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
- mdast-util-from-markdown@0.8.5:
- resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==}
+ markdown-table@3.0.3:
+ resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
- mdast-util-to-string@2.0.0:
- resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==}
+ mdast-util-find-and-replace@3.0.1:
+ resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
+
+ mdast-util-from-markdown@2.0.1:
+ resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==}
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+ mdast-util-gfm-footnote@2.0.0:
+ resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+ mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+ mdast-util-gfm@3.0.0:
+ resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-markdown@2.1.0:
+ resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
mdn-data@2.0.28:
resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
@@ -2032,18 +1960,96 @@ packages:
mdn-data@2.0.30:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
- merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
-
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
- micromark@2.11.4:
- resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==}
+ micromark-core-commonmark@2.0.1:
+ resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==}
- micromatch@4.0.7:
- resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+ micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+ micromark-extension-gfm-table@2.1.0:
+ resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==}
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+ micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+ micromark-factory-destination@2.0.0:
+ resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==}
+
+ micromark-factory-label@2.0.0:
+ resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==}
+
+ micromark-factory-space@2.0.0:
+ resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==}
+
+ micromark-factory-title@2.0.0:
+ resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==}
+
+ micromark-factory-whitespace@2.0.0:
+ resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==}
+
+ micromark-util-character@2.1.0:
+ resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==}
+
+ micromark-util-chunked@2.0.0:
+ resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==}
+
+ micromark-util-classify-character@2.0.0:
+ resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==}
+
+ micromark-util-combine-extensions@2.0.0:
+ resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==}
+
+ micromark-util-decode-numeric-character-reference@2.0.1:
+ resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==}
+
+ micromark-util-decode-string@2.0.0:
+ resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==}
+
+ micromark-util-encode@2.0.0:
+ resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+
+ micromark-util-html-tag-name@2.0.0:
+ resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==}
+
+ micromark-util-normalize-identifier@2.0.0:
+ resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==}
+
+ micromark-util-resolve-all@2.0.0:
+ resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==}
+
+ micromark-util-sanitize-uri@2.0.0:
+ resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
+
+ micromark-util-subtokenize@2.0.1:
+ resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==}
+
+ micromark-util-symbol@2.0.0:
+ resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
+
+ micromark-util-types@2.0.0:
+ resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
+
+ micromark@4.0.0:
+ resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
mime-db@1.52.0:
@@ -2054,10 +2060,6 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
- mimic-fn@4.0.0:
- resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
- engines: {node: '>=12'}
-
min-indent@1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
@@ -2080,8 +2082,8 @@ packages:
mlly@1.7.1:
resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==}
- ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ mlly@1.7.2:
+ resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==}
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -2104,11 +2106,8 @@ packages:
resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==}
engines: {node: '>=18'}
- node-releases@2.0.14:
- resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
-
- node-releases@2.0.17:
- resolution: {integrity: sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==}
+ node-releases@2.0.18:
+ resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
nopt@7.2.1:
resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
@@ -2118,27 +2117,15 @@ packages:
normalize-package-data@2.5.0:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
- normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
-
- npm-run-path@5.3.0:
- resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
- nwsapi@2.2.10:
- resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==}
+ nwsapi@2.2.13:
+ resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==}
once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
- onetime@6.0.0:
- resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
- engines: {node: '>=12'}
-
optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
@@ -2163,22 +2150,22 @@ packages:
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
engines: {node: '>=6'}
- package-json-from-dist@1.0.0:
- resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ package-manager-detector@0.2.2:
+ resolution: {integrity: sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==}
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
- parse-entities@2.0.0:
- resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
-
parse-gitignore@2.0.0:
resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==}
engines: {node: '>=14'}
- parse-imports@2.1.1:
- resolution: {integrity: sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==}
+ parse-imports@2.2.1:
+ resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==}
engines: {node: '>= 18'}
parse-json@5.2.0:
@@ -2203,10 +2190,6 @@ packages:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
- path-key@4.0.0:
- resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
- engines: {node: '>=12'}
-
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
@@ -2225,8 +2208,11 @@ packages:
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
engines: {node: '>= 14.16'}
- picocolors@1.0.1:
- resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ picocolors@1.1.0:
+ resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -2236,8 +2222,8 @@ packages:
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
engines: {node: '>=12'}
- pinia@2.1.7:
- resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==}
+ pinia@2.2.4:
+ resolution: {integrity: sha512-K7ZhpMY9iJ9ShTC0cR2+PnxdQRuwVIsXDO/WIEV/RnMC/vmSoKDTKW/exNQYPI+4ij10UjXqdNiEHwn47McANQ==}
peerDependencies:
'@vue/composition-api': ^1.4.0
typescript: '>=4.4.4'
@@ -2248,8 +2234,8 @@ packages:
typescript:
optional: true
- pkg-types@1.1.3:
- resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==}
+ pkg-types@1.2.1:
+ resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
pluralize@8.0.0:
resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
@@ -2267,20 +2253,16 @@ packages:
peerDependencies:
postcss: ^8.4.29
- postcss-selector-parser@6.1.0:
- resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==}
- engines: {node: '>=4'}
-
- postcss-selector-parser@6.1.1:
- resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==}
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'}
postcss-styl@0.12.3:
resolution: {integrity: sha512-8I7Cd8sxiEITIp32xBK4K/Aj1ukX6vuWnx8oY/oAH35NfQI4OZaY5nd68Yx8HeN5S49uhQ6DL0rNk0ZBu/TaLg==}
engines: {node: ^8.10.0 || ^10.13.0 || ^11.10.1 || >=12.13.0}
- postcss@8.4.39:
- resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==}
+ postcss@8.4.47:
+ resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1:
@@ -2299,16 +2281,10 @@ packages:
proto-list@1.2.4:
resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
- psl@1.9.0:
- resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
-
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
- querystringify@2.2.0:
- resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
-
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -2320,10 +2296,6 @@ packages:
resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
engines: {node: '>=8'}
- readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
-
refa@0.12.1:
resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
@@ -2343,8 +2315,8 @@ packages:
resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==}
hasBin: true
- replace-in-file@8.1.0:
- resolution: {integrity: sha512-ySYfKDH6uFVC4Wt6DcZ2UX0UMCqE7xhWGVqje/15WFVwHxnel1gdZjV8nOW9Nms6h/yQE2MWyeIToeqFLZkp4w==}
+ replace-in-file@8.2.0:
+ resolution: {integrity: sha512-hMsQtdYHwWviQT5ZbNsgfu0WuCiNlcUSnnD+aHAL081kbU9dPkPocDaHlDvAHKydTWWpx1apfcEcmvIyQk3CpQ==}
engines: {node: '>=18'}
hasBin: true
@@ -2352,9 +2324,6 @@ packages:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
- requires-port@1.0.0:
- resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
-
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -2370,14 +2339,11 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
- rollup@4.18.1:
- resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==}
+ rollup@4.24.0:
+ resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
- rrweb-cssom@0.6.0:
- resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==}
-
rrweb-cssom@0.7.1:
resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==}
@@ -2418,8 +2384,8 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
- simple-icons@12.4.0:
- resolution: {integrity: sha512-2uL8PHFDyBLQGhZsAvYcaHqm5KjNzIepPshTLZky9Dc6HgPFI83SAVC8of3KYtr+7O8zJggrGYTxyUu/9hyYgA==}
+ simple-icons@13.15.0:
+ resolution: {integrity: sha512-8SzFj9CvPlDnjDLISsAWTvpCs7om2zbSJZ1hNLRo6quWKLqFwjCD9opS24Q/yD0bdsnVHPpF0N3hitpHrY5u9w==}
engines: {node: '>=0.12.18'}
sisteransi@1.0.5:
@@ -2436,8 +2402,8 @@ packages:
slashes@3.0.12:
resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==}
- source-map-js@1.2.0:
- resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
source-map-resolve@0.6.0:
@@ -2464,8 +2430,8 @@ packages:
spdx-expression-parse@4.0.0:
resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==}
- spdx-license-ids@3.0.18:
- resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==}
+ spdx-license-ids@3.0.20:
+ resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==}
stable-hash@0.0.4:
resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==}
@@ -2476,10 +2442,6 @@ packages:
std-env@3.7.0:
resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
- string-argv@0.3.2:
- resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
- engines: {node: '>=0.6.19'}
-
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -2496,10 +2458,6 @@ packages:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'}
- strip-final-newline@3.0.0:
- resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
- engines: {node: '>=12'}
-
strip-indent@3.0.0:
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
engines: {node: '>=8'}
@@ -2536,14 +2494,14 @@ packages:
resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==}
engines: {node: '>=12.20'}
- synckit@0.9.0:
- resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==}
- engines: {node: ^14.18.0 || >=16.0.0}
-
synckit@0.9.1:
resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==}
engines: {node: ^14.18.0 || >=16.0.0}
+ synckit@0.9.2:
+ resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+
tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
@@ -2551,24 +2509,34 @@ packages:
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
- tinybench@2.8.0:
- resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==}
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
tinycolor2@1.6.0:
resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
- tinypool@1.0.0:
- resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==}
+ tinyexec@0.3.1:
+ resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==}
+
+ tinypool@1.0.1:
+ resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==}
engines: {node: ^18.0.0 || >=20.0.0}
tinyrainbow@1.2.0:
resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
engines: {node: '>=14.0.0'}
- tinyspy@3.0.0:
- resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==}
+ tinyspy@3.0.2:
+ resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
engines: {node: '>=14.0.0'}
+ tldts-core@6.1.50:
+ resolution: {integrity: sha512-na2EcZqmdA2iV9zHV7OHQDxxdciEpxrjbkp+aHmZgnZKHzoElLajP59np5/4+sare9fQBfixgvXKx8ev1d7ytw==}
+
+ tldts@6.1.50:
+ resolution: {integrity: sha512-q9GOap6q3KCsLMdOjXhWU5jVZ8/1dIib898JBRLsN+tBhENpBDcAVQbE0epADOjw11FhQQy9AcbqKGBQPUfTQA==}
+ hasBin: true
+
to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
@@ -2581,9 +2549,9 @@ packages:
resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- tough-cookie@4.1.4:
- resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
- engines: {node: '>=6'}
+ tough-cookie@5.0.0:
+ resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==}
+ engines: {node: '>=16'}
tr46@5.0.0:
resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
@@ -2595,17 +2563,16 @@ packages:
peerDependencies:
typescript: '>=4.2.0'
- tslib@2.6.3:
- resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+ tslib@2.7.0:
+ resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
+
+ tslib@2.8.0:
+ resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==}
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
- type-detect@4.0.8:
- resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
- engines: {node: '>=4'}
-
type-fest@0.20.2:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
@@ -2618,44 +2585,44 @@ packages:
resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
engines: {node: '>=8'}
- typescript-eslint@7.16.1:
- resolution: {integrity: sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA==}
- engines: {node: ^18.18.0 || >=20.0.0}
- peerDependencies:
- eslint: ^8.56.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- typescript@5.5.3:
- resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
+ typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
engines: {node: '>=14.17'}
hasBin: true
ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
- undici-types@5.26.5:
- resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
unicode-emoji-modifier-base@1.0.0:
resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==}
engines: {node: '>=4'}
- unist-util-stringify-position@2.0.3:
- resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==}
+ unist-util-is@6.0.0:
+ resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
- universalify@0.2.0:
- resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
- engines: {node: '>= 4.0.0'}
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
- unplugin@1.11.0:
- resolution: {integrity: sha512-3r7VWZ/webh0SGgJScpWl2/MRCZK5d3ZYFcNaeci/GQ7Teop7zf0Nl2pUuz7G21BwPd9pcUPOC5KmJ2L3WgC5g==}
+ unist-util-visit-parents@6.0.1:
+ resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
+ unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
+ unplugin@1.14.1:
+ resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==}
engines: {node: '>=14.0.0'}
+ peerDependencies:
+ webpack-sources: ^3
+ peerDependenciesMeta:
+ webpack-sources:
+ optional: true
- update-browserslist-db@1.1.0:
- resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
+ update-browserslist-db@1.1.1:
+ resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
@@ -2663,17 +2630,14 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
- url-parse@1.5.10:
- resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
-
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
- vite-node@2.0.3:
- resolution: {integrity: sha512-14jzwMx7XTcMB+9BhGQyoEAmSl0eOr3nrnn+Z12WNERtOvLN+d2scbRUvyni05rT3997Bg+rZb47NyP4IQPKXg==}
+ vite-node@2.1.3:
+ resolution: {integrity: sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
@@ -2691,8 +2655,8 @@ packages:
peerDependencies:
vue: '>=3.2.13'
- vite@5.3.4:
- resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==}
+ vite@5.4.10:
+ resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -2700,6 +2664,7 @@ packages:
less: '*'
lightningcss: ^1.21.0
sass: '*'
+ sass-embedded: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
@@ -2712,6 +2677,8 @@ packages:
optional: true
sass:
optional: true
+ sass-embedded:
+ optional: true
stylus:
optional: true
sugarss:
@@ -2719,15 +2686,15 @@ packages:
terser:
optional: true
- vitest@2.0.3:
- resolution: {integrity: sha512-o3HRvU93q6qZK4rI2JrhKyZMMuxg/JRt30E6qeQs6ueaiz5hr1cPj+Sk2kATgQzMMqsa2DiNI0TIK++1ULx8Jw==}
+ vitest@2.1.3:
+ resolution: {integrity: sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@types/node': ^18.0.0 || >=20.0.0
- '@vitest/browser': 2.0.3
- '@vitest/ui': 2.0.3
+ '@vitest/browser': 2.1.3
+ '@vitest/ui': 2.1.3
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
@@ -2747,11 +2714,11 @@ packages:
vscode-uri@3.0.8:
resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
- vue-component-type-helpers@2.0.26:
- resolution: {integrity: sha512-sO9qQ8oC520SW6kqlls0iqDak53gsTVSrYylajgjmkt1c0vcgjsGSy1KzlDrbEx8pm02IEYhlUkU5hCYf8rwtg==}
+ vue-component-type-helpers@2.1.6:
+ resolution: {integrity: sha512-ng11B8B/ZADUMMOsRbqv0arc442q7lifSubD0v8oDXIFoMg/mXwAPUunrroIDkY+mcD0dHKccdaznSVp8EoX3w==}
- vue-demi@0.14.8:
- resolution: {integrity: sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==}
+ vue-demi@0.14.10:
+ resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
engines: {node: '>=12'}
hasBin: true
peerDependencies:
@@ -2767,28 +2734,25 @@ packages:
peerDependencies:
eslint: '>=6.0.0'
- vue-i18n@9.13.1:
- resolution: {integrity: sha512-mh0GIxx0wPtPlcB1q4k277y0iKgo25xmDPWioVVYanjPufDBpvu5ySTjP5wOrSvlYQ2m1xI+CFhGdauv/61uQg==}
+ vue-i18n@10.0.4:
+ resolution: {integrity: sha512-1xkzVxqBLk2ZFOmeI+B5r1J7aD/WtNJ4j9k2mcFcQo5BnOmHBmD7z4/oZohh96AAaRZ4Q7mNQvxc9h+aT+Md3w==}
engines: {node: '>= 16'}
peerDependencies:
vue: ^3.0.0
- vue-router@4.4.0:
- resolution: {integrity: sha512-HB+t2p611aIZraV2aPSRNXf0Z/oLZFrlygJm+sZbdJaW6lcFqEDQwnzUBXn+DApw+/QzDU/I9TeWx9izEjTmsA==}
+ vue-router@4.4.5:
+ resolution: {integrity: sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==}
peerDependencies:
vue: ^3.2.0
- vue-template-compiler@2.7.16:
- resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==}
-
- vue-tsc@2.0.26:
- resolution: {integrity: sha512-tOhuwy2bIXbMhz82ef37qeiaQHMXKQkD6mOF6CCPl3/uYtST3l6fdNyfMxipudrQTxTfXVPlgJdMENBFfC1CfQ==}
+ vue-tsc@2.1.8:
+ resolution: {integrity: sha512-6+vjb7JLxKIzeD/1ktoUBZGAr+148FQoEFl8Lv5EpDJLO2PrUalhp7atMEuzEkLnoooM5bg3pJqjZI+oobxIaQ==}
hasBin: true
peerDependencies:
typescript: '>=5.0.0'
- vue@3.4.32:
- resolution: {integrity: sha512-9mCGIAi/CAq7GtaLLLp2J92pEic+HArstG+pq6F+H7+/jB9a0Z7576n4Bh4k79/50L1cKMIhZC3MC0iGpl+1IA==}
+ vue@3.5.12:
+ resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
@@ -2803,10 +2767,6 @@ packages:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
- webpack-sources@3.2.3:
- resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
- engines: {node: '>=10.13.0'}
-
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
@@ -2886,8 +2846,8 @@ packages:
resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==}
engines: {node: ^14.17.0 || >=16.0.0}
- yaml@2.4.5:
- resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==}
+ yaml@2.6.0:
+ resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==}
engines: {node: '>= 14'}
hasBin: true
@@ -2903,6 +2863,9 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
snapshots:
'@ampproject/remapping@2.3.0':
@@ -2910,274 +2873,207 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
- '@antfu/eslint-config@2.23.0(@vue/compiler-sfc@3.4.32)(eslint@9.7.0)(typescript@5.5.3)(vitest@2.0.3(@types/node@20.14.11)(jsdom@24.1.0)(stylus@0.57.0))':
+ '@antfu/eslint-config@3.8.0(@typescript-eslint/utils@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.12)(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.3(@types/node@20.17.1)(jsdom@25.0.1)(stylus@0.57.0))':
dependencies:
- '@antfu/eslint-plugin-unused-imports': 4.0.0(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)
- '@antfu/install-pkg': 0.3.3
+ '@antfu/install-pkg': 0.4.1
'@clack/prompts': 0.7.0
- '@stylistic/eslint-plugin': 2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)
- eslint: 9.7.0
- eslint-config-flat-gitignore: 0.1.8
- eslint-flat-config-utils: 0.2.5
- eslint-merge-processors: 0.1.0(eslint@9.7.0)
- eslint-plugin-antfu: 2.3.4(eslint@9.7.0)
- eslint-plugin-command: 0.2.3(eslint@9.7.0)
- eslint-plugin-eslint-comments: 3.2.0(eslint@9.7.0)
- eslint-plugin-import-x: 3.0.1(eslint@9.7.0)(typescript@5.5.3)
- eslint-plugin-jsdoc: 48.7.0(eslint@9.7.0)
- eslint-plugin-jsonc: 2.16.0(eslint@9.7.0)
- eslint-plugin-markdown: 5.1.0(eslint@9.7.0)
- eslint-plugin-n: 17.9.0(eslint@9.7.0)
- eslint-plugin-no-only-tests: 3.1.0
- eslint-plugin-perfectionist: 2.11.0(eslint@9.7.0)(typescript@5.5.3)(vue-eslint-parser@9.4.3(eslint@9.7.0))
- eslint-plugin-regexp: 2.6.0(eslint@9.7.0)
- eslint-plugin-toml: 0.11.1(eslint@9.7.0)
- eslint-plugin-unicorn: 54.0.0(eslint@9.7.0)
- eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@2.0.3(@types/node@20.14.11)(jsdom@24.1.0)(stylus@0.57.0))
- eslint-plugin-vue: 9.27.0(eslint@9.7.0)
- eslint-plugin-yml: 1.14.0(eslint@9.7.0)
- eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.32)(eslint@9.7.0)
- globals: 15.8.0
+ '@eslint-community/eslint-plugin-eslint-comments': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ '@eslint/markdown': 6.2.1
+ '@stylistic/eslint-plugin': 2.9.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/eslint-plugin': 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.3(@types/node@20.17.1)(jsdom@25.0.1)(stylus@0.57.0))
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-config-flat-gitignore: 0.3.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-flat-config-utils: 0.4.0
+ eslint-merge-processors: 0.1.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-antfu: 2.7.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-command: 0.2.6(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-import-x: 4.3.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ eslint-plugin-jsdoc: 50.4.3(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-jsonc: 2.16.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-n: 17.11.1(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-no-only-tests: 3.3.0
+ eslint-plugin-perfectionist: 3.9.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(vue-eslint-parser@9.4.3(eslint@9.13.0(jiti@1.21.6)))
+ eslint-plugin-regexp: 2.6.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-toml: 0.11.1(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-unicorn: 56.0.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-vue: 9.29.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-plugin-yml: 1.14.0(eslint@9.13.0(jiti@1.21.6))
+ eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.5.12)(eslint@9.13.0(jiti@1.21.6))
+ globals: 15.11.0
jsonc-eslint-parser: 2.4.0
local-pkg: 0.5.0
parse-gitignore: 2.0.0
- picocolors: 1.0.1
+ picocolors: 1.1.1
toml-eslint-parser: 0.10.0
- vue-eslint-parser: 9.4.3(eslint@9.7.0)
+ vue-eslint-parser: 9.4.3(eslint@9.13.0(jiti@1.21.6))
yaml-eslint-parser: 1.2.3
yargs: 17.7.2
transitivePeerDependencies:
+ - '@typescript-eslint/utils'
- '@vue/compiler-sfc'
- supports-color
- svelte
- typescript
- vitest
- '@antfu/eslint-plugin-unused-imports@4.0.0(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)':
+ '@antfu/install-pkg@0.4.1':
dependencies:
- eslint: 9.7.0
- eslint-rule-composer: 0.3.0
- optionalDependencies:
- '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)
-
- '@antfu/install-pkg@0.3.3':
- dependencies:
- '@jsdevtools/ez-spawn': 3.0.4
+ package-manager-detector: 0.2.2
+ tinyexec: 0.3.1
'@antfu/utils@0.7.10': {}
- '@babel/code-frame@7.24.7':
+ '@babel/code-frame@7.25.7':
dependencies:
- '@babel/highlight': 7.24.7
- picocolors: 1.0.1
+ '@babel/highlight': 7.25.7
+ picocolors: 1.1.1
- '@babel/compat-data@7.24.7': {}
+ '@babel/compat-data@7.25.7': {}
- '@babel/compat-data@7.24.9': {}
-
- '@babel/core@7.24.7':
+ '@babel/core@7.25.7':
dependencies:
'@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.24.10
- '@babel/helper-compilation-targets': 7.24.7
- '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
- '@babel/helpers': 7.24.7
- '@babel/parser': 7.24.8
- '@babel/template': 7.24.7
- '@babel/traverse': 7.24.8
- '@babel/types': 7.24.9
+ '@babel/code-frame': 7.25.7
+ '@babel/generator': 7.25.7
+ '@babel/helper-compilation-targets': 7.25.7
+ '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.7)
+ '@babel/helpers': 7.25.7
+ '@babel/parser': 7.25.7
+ '@babel/template': 7.25.7
+ '@babel/traverse': 7.25.7
+ '@babel/types': 7.25.7
convert-source-map: 2.0.0
- debug: 4.3.5
+ debug: 4.3.7
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 7.6.3
transitivePeerDependencies:
- supports-color
- '@babel/core@7.24.9':
+ '@babel/generator@7.25.7':
dependencies:
- '@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.24.10
- '@babel/helper-compilation-targets': 7.24.8
- '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9)
- '@babel/helpers': 7.24.8
- '@babel/parser': 7.24.8
- '@babel/template': 7.24.7
- '@babel/traverse': 7.24.8
- '@babel/types': 7.24.9
- convert-source-map: 2.0.0
- debug: 4.3.5
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 7.6.3
- transitivePeerDependencies:
- - supports-color
-
- '@babel/generator@7.24.10':
- dependencies:
- '@babel/types': 7.24.9
+ '@babel/types': 7.25.7
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
- jsesc: 2.5.2
+ jsesc: 3.0.2
- '@babel/helper-compilation-targets@7.24.7':
+ '@babel/helper-compilation-targets@7.25.7':
dependencies:
- '@babel/compat-data': 7.24.7
- '@babel/helper-validator-option': 7.24.7
- browserslist: 4.23.1
+ '@babel/compat-data': 7.25.7
+ '@babel/helper-validator-option': 7.25.7
+ browserslist: 4.24.0
lru-cache: 5.1.1
semver: 7.6.3
- '@babel/helper-compilation-targets@7.24.8':
+ '@babel/helper-module-imports@7.25.7':
dependencies:
- '@babel/compat-data': 7.24.9
- '@babel/helper-validator-option': 7.24.8
- browserslist: 4.23.2
- lru-cache: 5.1.1
- semver: 7.6.3
-
- '@babel/helper-environment-visitor@7.24.7':
- dependencies:
- '@babel/types': 7.24.9
-
- '@babel/helper-function-name@7.24.7':
- dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.9
-
- '@babel/helper-hoist-variables@7.24.7':
- dependencies:
- '@babel/types': 7.24.9
-
- '@babel/helper-module-imports@7.24.7':
- dependencies:
- '@babel/traverse': 7.24.8
- '@babel/types': 7.24.9
+ '@babel/traverse': 7.25.7
+ '@babel/types': 7.25.7
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)':
+ '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.7)':
dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-module-imports': 7.24.7
- '@babel/helper-simple-access': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
+ '@babel/core': 7.25.7
+ '@babel/helper-module-imports': 7.25.7
+ '@babel/helper-simple-access': 7.25.7
+ '@babel/helper-validator-identifier': 7.25.7
+ '@babel/traverse': 7.25.7
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.24.9(@babel/core@7.24.9)':
+ '@babel/helper-simple-access@7.25.7':
dependencies:
- '@babel/core': 7.24.9
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-module-imports': 7.24.7
- '@babel/helper-simple-access': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
+ '@babel/traverse': 7.25.7
+ '@babel/types': 7.25.7
transitivePeerDependencies:
- supports-color
- '@babel/helper-simple-access@7.24.7':
+ '@babel/helper-string-parser@7.25.7': {}
+
+ '@babel/helper-validator-identifier@7.25.7': {}
+
+ '@babel/helper-validator-option@7.25.7': {}
+
+ '@babel/helpers@7.25.7':
dependencies:
- '@babel/traverse': 7.24.8
- '@babel/types': 7.24.9
- transitivePeerDependencies:
- - supports-color
+ '@babel/template': 7.25.7
+ '@babel/types': 7.25.7
- '@babel/helper-split-export-declaration@7.24.7':
+ '@babel/highlight@7.25.7':
dependencies:
- '@babel/types': 7.24.9
-
- '@babel/helper-string-parser@7.24.8': {}
-
- '@babel/helper-validator-identifier@7.24.7': {}
-
- '@babel/helper-validator-option@7.24.7': {}
-
- '@babel/helper-validator-option@7.24.8': {}
-
- '@babel/helpers@7.24.7':
- dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.9
-
- '@babel/helpers@7.24.8':
- dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.9
-
- '@babel/highlight@7.24.7':
- dependencies:
- '@babel/helper-validator-identifier': 7.24.7
+ '@babel/helper-validator-identifier': 7.25.7
chalk: 2.4.2
js-tokens: 4.0.0
- picocolors: 1.0.1
+ picocolors: 1.1.1
- '@babel/parser@7.24.8':
+ '@babel/parser@7.25.7':
dependencies:
- '@babel/types': 7.24.9
+ '@babel/types': 7.25.7
- '@babel/runtime@7.24.7':
+ '@babel/parser@7.25.8':
+ dependencies:
+ '@babel/types': 7.25.8
+
+ '@babel/runtime@7.25.7':
dependencies:
regenerator-runtime: 0.14.1
- '@babel/template@7.24.7':
+ '@babel/template@7.25.7':
dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/parser': 7.24.8
- '@babel/types': 7.24.9
+ '@babel/code-frame': 7.25.7
+ '@babel/parser': 7.25.7
+ '@babel/types': 7.25.7
- '@babel/traverse@7.24.8':
+ '@babel/traverse@7.25.7':
dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.24.10
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-function-name': 7.24.7
- '@babel/helper-hoist-variables': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
- '@babel/parser': 7.24.8
- '@babel/types': 7.24.9
- debug: 4.3.5
+ '@babel/code-frame': 7.25.7
+ '@babel/generator': 7.25.7
+ '@babel/parser': 7.25.7
+ '@babel/template': 7.25.7
+ '@babel/types': 7.25.7
+ debug: 4.3.7
globals: 11.12.0
transitivePeerDependencies:
- supports-color
- '@babel/types@7.24.9':
+ '@babel/types@7.25.7':
dependencies:
- '@babel/helper-string-parser': 7.24.8
- '@babel/helper-validator-identifier': 7.24.7
+ '@babel/helper-string-parser': 7.25.7
+ '@babel/helper-validator-identifier': 7.25.7
+ to-fast-properties: 2.0.0
+
+ '@babel/types@7.25.8':
+ dependencies:
+ '@babel/helper-string-parser': 7.25.7
+ '@babel/helper-validator-identifier': 7.25.7
to-fast-properties: 2.0.0
'@clack/core@0.3.4':
dependencies:
- picocolors: 1.0.1
+ picocolors: 1.1.1
sisteransi: 1.0.5
'@clack/prompts@0.7.0':
dependencies:
'@clack/core': 0.3.4
- picocolors: 1.0.1
+ picocolors: 1.1.1
sisteransi: 1.0.5
- '@es-joy/jsdoccomment@0.43.1':
+ '@es-joy/jsdoccomment@0.48.0':
dependencies:
- '@types/eslint': 8.56.10
- '@types/estree': 1.0.5
- '@typescript-eslint/types': 7.16.1
comment-parser: 1.4.1
esquery: 1.6.0
- jsdoc-type-pratt-parser: 4.0.0
+ jsdoc-type-pratt-parser: 4.1.0
- '@es-joy/jsdoccomment@0.46.0':
+ '@es-joy/jsdoccomment@0.49.0':
dependencies:
comment-parser: 1.4.1
esquery: 1.6.0
- jsdoc-type-pratt-parser: 4.0.0
+ jsdoc-type-pratt-parser: 4.1.0
'@esbuild/aix-ppc64@0.21.5':
optional: true
@@ -3248,28 +3144,40 @@ snapshots:
'@esbuild/win32-x64@0.21.5':
optional: true
- '@eslint-community/eslint-utils@4.4.0(eslint@9.7.0)':
+ '@eslint-community/eslint-plugin-eslint-comments@4.4.0(eslint@9.13.0(jiti@1.21.6))':
dependencies:
- eslint: 9.7.0
+ escape-string-regexp: 4.0.0
+ eslint: 9.13.0(jiti@1.21.6)
+ ignore: 5.3.2
+
+ '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0(jiti@1.21.6))':
+ dependencies:
+ eslint: 9.13.0(jiti@1.21.6)
eslint-visitor-keys: 3.4.3
- '@eslint-community/regexpp@4.11.0': {}
+ '@eslint-community/regexpp@4.11.1': {}
- '@eslint/config-array@0.17.0':
+ '@eslint/compat@1.2.1(eslint@9.13.0(jiti@1.21.6))':
+ optionalDependencies:
+ eslint: 9.13.0(jiti@1.21.6)
+
+ '@eslint/config-array@0.18.0':
dependencies:
'@eslint/object-schema': 2.1.4
- debug: 4.3.5
+ debug: 4.3.7
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
+ '@eslint/core@0.7.0': {}
+
'@eslint/eslintrc@3.1.0':
dependencies:
ajv: 6.12.6
- debug: 4.3.5
- espree: 10.1.0
+ debug: 4.3.7
+ espree: 10.2.0
globals: 14.0.0
- ignore: 5.3.1
+ ignore: 5.3.2
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
@@ -3277,58 +3185,83 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/js@9.7.0': {}
+ '@eslint/js@9.13.0': {}
- '@eslint/object-schema@2.1.4': {}
-
- '@humanwhocodes/module-importer@1.0.1': {}
-
- '@humanwhocodes/retry@0.3.0': {}
-
- '@ianvs/prettier-plugin-sort-imports@4.3.1(@vue/compiler-sfc@3.4.32)(prettier@3.3.3)':
+ '@eslint/markdown@6.2.1':
dependencies:
- '@babel/core': 7.24.9
- '@babel/generator': 7.24.10
- '@babel/parser': 7.24.8
- '@babel/traverse': 7.24.8
- '@babel/types': 7.24.9
- prettier: 3.3.3
- semver: 7.6.3
- optionalDependencies:
- '@vue/compiler-sfc': 3.4.32
+ '@eslint/plugin-kit': 0.2.1
+ mdast-util-from-markdown: 2.0.1
+ mdast-util-gfm: 3.0.0
+ micromark-extension-gfm: 3.0.0
transitivePeerDependencies:
- supports-color
- '@intlify/bundle-utils@8.0.0(vue-i18n@9.13.1(vue@3.4.32(typescript@5.5.3)))':
+ '@eslint/object-schema@2.1.4': {}
+
+ '@eslint/plugin-kit@0.2.1':
dependencies:
- '@intlify/message-compiler': 9.13.1
- '@intlify/shared': 9.13.1
- acorn: 8.12.1
+ levn: 0.4.1
+
+ '@humanfs/core@0.19.0': {}
+
+ '@humanfs/node@0.16.5':
+ dependencies:
+ '@humanfs/core': 0.19.0
+ '@humanwhocodes/retry': 0.3.1
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.3.1': {}
+
+ '@ianvs/prettier-plugin-sort-imports@4.3.1(@vue/compiler-sfc@3.5.12)(prettier@3.3.3)':
+ dependencies:
+ '@babel/core': 7.25.7
+ '@babel/generator': 7.25.7
+ '@babel/parser': 7.25.7
+ '@babel/traverse': 7.25.7
+ '@babel/types': 7.25.7
+ prettier: 3.3.3
+ semver: 7.6.3
+ optionalDependencies:
+ '@vue/compiler-sfc': 3.5.12
+ transitivePeerDependencies:
+ - supports-color
+
+ '@intlify/bundle-utils@9.0.0-beta.0(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))':
+ dependencies:
+ '@intlify/message-compiler': 10.0.0
+ '@intlify/shared': 10.0.0
+ acorn: 8.13.0
escodegen: 2.1.0
estree-walker: 2.0.2
jsonc-eslint-parser: 2.4.0
mlly: 1.7.1
- source-map-js: 1.2.0
+ source-map-js: 1.2.1
yaml-eslint-parser: 1.2.3
optionalDependencies:
- vue-i18n: 9.13.1(vue@3.4.32(typescript@5.5.3))
+ vue-i18n: 10.0.4(vue@3.5.12(typescript@5.6.3))
- '@intlify/core-base@9.13.1':
+ '@intlify/core-base@10.0.4':
dependencies:
- '@intlify/message-compiler': 9.13.1
- '@intlify/shared': 9.13.1
+ '@intlify/message-compiler': 10.0.4
+ '@intlify/shared': 10.0.4
- '@intlify/eslint-plugin-vue-i18n@3.0.0(eslint@9.7.0)':
+ '@intlify/core-base@9.14.1':
+ dependencies:
+ '@intlify/message-compiler': 9.14.1
+ '@intlify/shared': 9.14.1
+
+ '@intlify/eslint-plugin-vue-i18n@3.0.0(eslint@9.13.0(jiti@1.21.6))':
dependencies:
'@eslint/eslintrc': 3.1.0
- '@intlify/core-base': 9.13.1
- '@intlify/message-compiler': 9.13.1
- debug: 4.3.5
- eslint: 9.7.0
- eslint-compat-utils: 0.5.1(eslint@9.7.0)
- glob: 10.4.2
- globals: 15.8.0
- ignore: 5.3.1
+ '@intlify/core-base': 9.14.1
+ '@intlify/message-compiler': 9.14.1
+ debug: 4.3.7
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.6))
+ glob: 10.4.5
+ globals: 15.10.0
+ ignore: 5.3.2
import-fresh: 3.3.0
is-language-code: 3.1.0
js-yaml: 4.1.0
@@ -3337,38 +3270,69 @@ snapshots:
lodash: 4.17.21
parse5: 7.1.2
semver: 7.6.3
- synckit: 0.9.0
- vue-eslint-parser: 9.4.3(eslint@9.7.0)
+ synckit: 0.9.1
+ vue-eslint-parser: 9.4.3(eslint@9.13.0(jiti@1.21.6))
yaml-eslint-parser: 1.2.3
transitivePeerDependencies:
- supports-color
- '@intlify/message-compiler@9.13.1':
+ '@intlify/message-compiler@10.0.0':
dependencies:
- '@intlify/shared': 9.13.1
- source-map-js: 1.2.0
+ '@intlify/shared': 10.0.0
+ source-map-js: 1.2.1
- '@intlify/shared@9.13.1': {}
-
- '@intlify/unplugin-vue-i18n@4.0.0(rollup@4.18.1)(vue-i18n@9.13.1(vue@3.4.32(typescript@5.5.3)))':
+ '@intlify/message-compiler@10.0.4':
dependencies:
- '@intlify/bundle-utils': 8.0.0(vue-i18n@9.13.1(vue@3.4.32(typescript@5.5.3)))
- '@intlify/shared': 9.13.1
- '@rollup/pluginutils': 5.1.0(rollup@4.18.1)
- '@vue/compiler-sfc': 3.4.32
- debug: 4.3.5
+ '@intlify/shared': 10.0.4
+ source-map-js: 1.2.1
+
+ '@intlify/message-compiler@9.14.1':
+ dependencies:
+ '@intlify/shared': 9.14.1
+ source-map-js: 1.2.1
+
+ '@intlify/shared@10.0.0': {}
+
+ '@intlify/shared@10.0.4': {}
+
+ '@intlify/shared@9.14.1': {}
+
+ '@intlify/unplugin-vue-i18n@5.2.0(@vue/compiler-dom@3.5.12)(eslint@9.13.0(jiti@1.21.6))(rollup@4.24.0)(typescript@5.6.3)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ '@intlify/bundle-utils': 9.0.0-beta.0(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))
+ '@intlify/shared': 10.0.0
+ '@intlify/vue-i18n-extensions': 7.0.0(@intlify/shared@10.0.0)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))
+ '@rollup/pluginutils': 5.1.2(rollup@4.24.0)
+ '@typescript-eslint/scope-manager': 7.18.0
+ '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3)
+ debug: 4.3.7
fast-glob: 3.3.2
js-yaml: 4.1.0
json5: 2.2.3
pathe: 1.1.2
- picocolors: 1.0.1
- source-map-js: 1.2.0
- unplugin: 1.11.0
+ picocolors: 1.1.0
+ source-map-js: 1.2.1
+ unplugin: 1.14.1
+ vue: 3.5.12(typescript@5.6.3)
optionalDependencies:
- vue-i18n: 9.13.1(vue@3.4.32(typescript@5.5.3))
+ vue-i18n: 10.0.4(vue@3.5.12(typescript@5.6.3))
transitivePeerDependencies:
+ - '@vue/compiler-dom'
+ - eslint
- rollup
- supports-color
+ - typescript
+ - webpack-sources
+
+ '@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@10.0.0)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))':
+ dependencies:
+ '@babel/parser': 7.25.8
+ optionalDependencies:
+ '@intlify/shared': 10.0.0
+ '@vue/compiler-dom': 3.5.12
+ vue: 3.5.12(typescript@5.6.3)
+ vue-i18n: 10.0.4(vue@3.5.12(typescript@5.6.3))
'@isaacs/cliui@8.0.2':
dependencies:
@@ -3396,16 +3360,9 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
- '@jsdevtools/ez-spawn@3.0.4':
+ '@kyvg/vue3-notification@3.4.0(vue@3.5.12(typescript@5.6.3))':
dependencies:
- call-me-maybe: 1.0.2
- cross-spawn: 7.0.3
- string-argv: 0.3.2
- type-detect: 4.0.8
-
- '@kyvg/vue3-notification@3.2.1(vue@3.4.32(typescript@5.5.3))':
- dependencies:
- vue: 3.4.32(typescript@5.5.3)
+ vue: 3.5.12(typescript@5.6.3)
'@mdi/js@7.4.47': {}
@@ -3428,496 +3385,393 @@ snapshots:
'@pkgr/core@0.1.1': {}
- '@rollup/pluginutils@5.1.0(rollup@4.18.1)':
+ '@rollup/pluginutils@5.1.2(rollup@4.24.0)':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 2.3.1
optionalDependencies:
- rollup: 4.18.1
+ rollup: 4.24.0
- '@rollup/rollup-android-arm-eabi@4.18.1':
+ '@rollup/rollup-android-arm-eabi@4.24.0':
optional: true
- '@rollup/rollup-android-arm64@4.18.1':
+ '@rollup/rollup-android-arm64@4.24.0':
optional: true
- '@rollup/rollup-darwin-arm64@4.18.1':
+ '@rollup/rollup-darwin-arm64@4.24.0':
optional: true
- '@rollup/rollup-darwin-x64@4.18.1':
+ '@rollup/rollup-darwin-x64@4.24.0':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.18.1':
+ '@rollup/rollup-linux-arm-gnueabihf@4.24.0':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.18.1':
+ '@rollup/rollup-linux-arm-musleabihf@4.24.0':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.18.1':
+ '@rollup/rollup-linux-arm64-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.18.1':
+ '@rollup/rollup-linux-arm64-musl@4.24.0':
optional: true
- '@rollup/rollup-linux-powerpc64le-gnu@4.18.1':
+ '@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.18.1':
+ '@rollup/rollup-linux-riscv64-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.18.1':
+ '@rollup/rollup-linux-s390x-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.18.1':
+ '@rollup/rollup-linux-x64-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-x64-musl@4.18.1':
+ '@rollup/rollup-linux-x64-musl@4.24.0':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.18.1':
+ '@rollup/rollup-win32-arm64-msvc@4.24.0':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.18.1':
+ '@rollup/rollup-win32-ia32-msvc@4.24.0':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.18.1':
+ '@rollup/rollup-win32-x64-msvc@4.24.0':
optional: true
- '@rtsao/scc@1.1.0': {}
-
'@sindresorhus/is@4.6.0': {}
- '@stylistic/eslint-plugin-js@2.6.0-beta.0(eslint@9.7.0)':
+ '@stylistic/eslint-plugin@2.9.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
dependencies:
- '@types/eslint': 8.56.10
- acorn: 8.12.1
- eslint: 9.7.0
- eslint-visitor-keys: 4.0.0
- espree: 10.1.0
-
- '@stylistic/eslint-plugin-jsx@2.6.0-beta.0(eslint@9.7.0)':
- dependencies:
- '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.7.0)
- '@types/eslint': 8.56.10
- eslint: 9.7.0
+ '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-visitor-keys: 4.1.0
+ espree: 10.2.0
estraverse: 5.3.0
picomatch: 4.0.2
-
- '@stylistic/eslint-plugin-plus@2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)':
- dependencies:
- '@types/eslint': 8.56.10
- '@typescript-eslint/utils': 8.0.0-alpha.45(eslint@9.7.0)(typescript@5.5.3)
- eslint: 9.7.0
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- '@stylistic/eslint-plugin-ts@2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)':
- dependencies:
- '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.7.0)
- '@types/eslint': 8.56.10
- '@typescript-eslint/utils': 8.0.0-alpha.45(eslint@9.7.0)(typescript@5.5.3)
- eslint: 9.7.0
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- '@stylistic/eslint-plugin@2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)':
- dependencies:
- '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.7.0)
- '@stylistic/eslint-plugin-jsx': 2.6.0-beta.0(eslint@9.7.0)
- '@stylistic/eslint-plugin-plus': 2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)
- '@stylistic/eslint-plugin-ts': 2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)
- '@types/eslint': 8.56.10
- eslint: 9.7.0
transitivePeerDependencies:
- supports-color
- typescript
'@trysound/sax@0.2.0': {}
- '@types/eslint@8.56.10':
+ '@types/debug@4.1.12':
dependencies:
- '@types/estree': 1.0.5
+ '@types/ms': 0.7.34
+
+ '@types/eslint@9.6.1':
+ dependencies:
+ '@types/estree': 1.0.6
'@types/json-schema': 7.0.15
'@types/eslint__js@8.42.3':
dependencies:
- '@types/eslint': 8.56.10
+ '@types/eslint': 9.6.1
- '@types/estree@1.0.5': {}
+ '@types/estree@1.0.6': {}
'@types/json-schema@7.0.15': {}
- '@types/lodash@4.17.7': {}
+ '@types/lodash@4.17.12': {}
- '@types/mdast@3.0.15':
+ '@types/mdast@4.0.4':
dependencies:
- '@types/unist': 2.0.10
+ '@types/unist': 3.0.3
- '@types/node@20.14.11':
+ '@types/ms@0.7.34': {}
+
+ '@types/node@20.17.1':
dependencies:
- undici-types: 5.26.5
+ undici-types: 6.19.8
'@types/normalize-package-data@2.4.4': {}
- '@types/prismjs@1.26.4': {}
+ '@types/prismjs@1.26.5': {}
'@types/semver@7.5.8': {}
'@types/tinycolor2@1.4.6': {}
- '@types/unist@2.0.10': {}
+ '@types/unist@3.0.3': {}
'@types/web-bluetooth@0.0.20': {}
- '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)':
+ '@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
dependencies:
- '@eslint-community/regexpp': 4.11.0
- '@typescript-eslint/parser': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/scope-manager': 7.16.1
- '@typescript-eslint/type-utils': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/utils': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/visitor-keys': 7.16.1
- eslint: 9.7.0
+ '@eslint-community/regexpp': 4.11.1
+ '@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/scope-manager': 8.10.0
+ '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.10.0
+ eslint: 9.13.0(jiti@1.21.6)
graphemer: 1.4.0
- ignore: 5.3.1
+ ignore: 5.3.2
natural-compare: 1.4.0
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)':
+ '@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
dependencies:
- '@eslint-community/regexpp': 4.11.0
- '@typescript-eslint/parser': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/scope-manager': 8.0.0-alpha.40
- '@typescript-eslint/type-utils': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.40
- eslint: 9.7.0
- graphemer: 1.4.0
- ignore: 5.3.1
- natural-compare: 1.4.0
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ '@typescript-eslint/scope-manager': 8.10.0
+ '@typescript-eslint/types': 8.10.0
+ '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.10.0
+ debug: 4.3.7
+ eslint: 9.13.0(jiti@1.21.6)
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3)':
+ '@typescript-eslint/scope-manager@7.18.0':
dependencies:
- '@typescript-eslint/scope-manager': 7.16.1
- '@typescript-eslint/types': 7.16.1
- '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3)
- '@typescript-eslint/visitor-keys': 7.16.1
- debug: 4.3.5
- eslint: 9.7.0
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/visitor-keys': 7.18.0
+
+ '@typescript-eslint/scope-manager@8.10.0':
+ dependencies:
+ '@typescript-eslint/types': 8.10.0
+ '@typescript-eslint/visitor-keys': 8.10.0
+
+ '@typescript-eslint/type-utils@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ debug: 4.3.7
+ ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
- typescript: 5.5.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)':
- dependencies:
- '@typescript-eslint/scope-manager': 8.0.0-alpha.40
- '@typescript-eslint/types': 8.0.0-alpha.40
- '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.5.3)
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.40
- debug: 4.3.5
- eslint: 9.7.0
- optionalDependencies:
- typescript: 5.5.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/scope-manager@7.16.1':
- dependencies:
- '@typescript-eslint/types': 7.16.1
- '@typescript-eslint/visitor-keys': 7.16.1
-
- '@typescript-eslint/scope-manager@8.0.0-alpha.40':
- dependencies:
- '@typescript-eslint/types': 8.0.0-alpha.40
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.40
-
- '@typescript-eslint/scope-manager@8.0.0-alpha.45':
- dependencies:
- '@typescript-eslint/types': 8.0.0-alpha.45
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.45
-
- '@typescript-eslint/type-utils@7.16.1(eslint@9.7.0)(typescript@5.5.3)':
- dependencies:
- '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3)
- '@typescript-eslint/utils': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- debug: 4.3.5
- eslint: 9.7.0
- ts-api-utils: 1.3.0(typescript@5.5.3)
- optionalDependencies:
- typescript: 5.5.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/type-utils@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)':
- dependencies:
- '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.5.3)
- '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)
- debug: 4.3.5
- ts-api-utils: 1.3.0(typescript@5.5.3)
- optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- eslint
- supports-color
- '@typescript-eslint/types@7.16.1': {}
+ '@typescript-eslint/types@7.18.0': {}
- '@typescript-eslint/types@8.0.0-alpha.40': {}
+ '@typescript-eslint/types@8.10.0': {}
- '@typescript-eslint/types@8.0.0-alpha.45': {}
-
- '@typescript-eslint/typescript-estree@7.16.1(typescript@5.5.3)':
+ '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.3)':
dependencies:
- '@typescript-eslint/types': 7.16.1
- '@typescript-eslint/visitor-keys': 7.16.1
- debug: 4.3.5
+ '@typescript-eslint/types': 7.18.0
+ '@typescript-eslint/visitor-keys': 7.18.0
+ debug: 4.3.7
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.0.0-alpha.40(typescript@5.5.3)':
+ '@typescript-eslint/typescript-estree@8.10.0(typescript@5.6.3)':
dependencies:
- '@typescript-eslint/types': 8.0.0-alpha.40
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.40
- debug: 4.3.5
- globby: 11.1.0
+ '@typescript-eslint/types': 8.10.0
+ '@typescript-eslint/visitor-keys': 8.10.0
+ debug: 4.3.7
+ fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.0.0-alpha.45(typescript@5.5.3)':
+ '@typescript-eslint/utils@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)':
dependencies:
- '@typescript-eslint/types': 8.0.0-alpha.45
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.45
- debug: 4.3.5
- globby: 11.1.0
- is-glob: 4.0.3
- minimatch: 9.0.5
- semver: 7.6.3
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ '@typescript-eslint/scope-manager': 8.10.0
+ '@typescript-eslint/types': 8.10.0
+ '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3)
+ eslint: 9.13.0(jiti@1.21.6)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ '@typescript-eslint/visitor-keys@7.18.0':
+ dependencies:
+ '@typescript-eslint/types': 7.18.0
+ eslint-visitor-keys: 3.4.3
+
+ '@typescript-eslint/visitor-keys@8.10.0':
+ dependencies:
+ '@typescript-eslint/types': 8.10.0
+ eslint-visitor-keys: 3.4.3
+
+ '@vitejs/plugin-vue@5.1.4(vite@5.4.10(@types/node@20.17.1)(stylus@0.57.0))(vue@3.5.12(typescript@5.6.3))':
+ dependencies:
+ vite: 5.4.10(@types/node@20.17.1)(stylus@0.57.0)
+ vue: 3.5.12(typescript@5.6.3)
+
+ '@vitest/eslint-plugin@1.1.7(@typescript-eslint/utils@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.3(@types/node@20.17.1)(jsdom@25.0.1)(stylus@0.57.0))':
+ dependencies:
+ '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ eslint: 9.13.0(jiti@1.21.6)
optionalDependencies:
- typescript: 5.5.3
- transitivePeerDependencies:
- - supports-color
+ typescript: 5.6.3
+ vitest: 2.1.3(@types/node@20.17.1)(jsdom@25.0.1)(stylus@0.57.0)
- '@typescript-eslint/utils@7.16.1(eslint@9.7.0)(typescript@5.5.3)':
+ '@vitest/expect@2.1.3':
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- '@typescript-eslint/scope-manager': 7.16.1
- '@typescript-eslint/types': 7.16.1
- '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3)
- eslint: 9.7.0
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- '@typescript-eslint/utils@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)':
- dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- '@typescript-eslint/scope-manager': 8.0.0-alpha.40
- '@typescript-eslint/types': 8.0.0-alpha.40
- '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.5.3)
- eslint: 9.7.0
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- '@typescript-eslint/utils@8.0.0-alpha.45(eslint@9.7.0)(typescript@5.5.3)':
- dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- '@typescript-eslint/scope-manager': 8.0.0-alpha.45
- '@typescript-eslint/types': 8.0.0-alpha.45
- '@typescript-eslint/typescript-estree': 8.0.0-alpha.45(typescript@5.5.3)
- eslint: 9.7.0
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- '@typescript-eslint/visitor-keys@7.16.1':
- dependencies:
- '@typescript-eslint/types': 7.16.1
- eslint-visitor-keys: 3.4.3
-
- '@typescript-eslint/visitor-keys@8.0.0-alpha.40':
- dependencies:
- '@typescript-eslint/types': 8.0.0-alpha.40
- eslint-visitor-keys: 3.4.3
-
- '@typescript-eslint/visitor-keys@8.0.0-alpha.45':
- dependencies:
- '@typescript-eslint/types': 8.0.0-alpha.45
- eslint-visitor-keys: 3.4.3
-
- '@vitejs/plugin-vue@5.0.5(vite@5.3.4(@types/node@20.14.11)(stylus@0.57.0))(vue@3.4.32(typescript@5.5.3))':
- dependencies:
- vite: 5.3.4(@types/node@20.14.11)(stylus@0.57.0)
- vue: 3.4.32(typescript@5.5.3)
-
- '@vitest/expect@2.0.3':
- dependencies:
- '@vitest/spy': 2.0.3
- '@vitest/utils': 2.0.3
+ '@vitest/spy': 2.1.3
+ '@vitest/utils': 2.1.3
chai: 5.1.1
tinyrainbow: 1.2.0
- '@vitest/pretty-format@2.0.3':
+ '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.10(@types/node@20.17.1)(stylus@0.57.0))':
dependencies:
- tinyrainbow: 1.2.0
-
- '@vitest/runner@2.0.3':
- dependencies:
- '@vitest/utils': 2.0.3
- pathe: 1.1.2
-
- '@vitest/snapshot@2.0.3':
- dependencies:
- '@vitest/pretty-format': 2.0.3
- magic-string: 0.30.10
- pathe: 1.1.2
-
- '@vitest/spy@2.0.3':
- dependencies:
- tinyspy: 3.0.0
-
- '@vitest/utils@2.0.3':
- dependencies:
- '@vitest/pretty-format': 2.0.3
+ '@vitest/spy': 2.1.3
estree-walker: 3.0.3
- loupe: 3.1.1
+ magic-string: 0.30.12
+ optionalDependencies:
+ vite: 5.4.10(@types/node@20.17.1)(stylus@0.57.0)
+
+ '@vitest/pretty-format@2.1.3':
+ dependencies:
tinyrainbow: 1.2.0
- '@volar/language-core@2.4.0-alpha.15':
+ '@vitest/runner@2.1.3':
dependencies:
- '@volar/source-map': 2.4.0-alpha.15
+ '@vitest/utils': 2.1.3
+ pathe: 1.1.2
- '@volar/source-map@2.4.0-alpha.15': {}
-
- '@volar/typescript@2.4.0-alpha.15':
+ '@vitest/snapshot@2.1.3':
dependencies:
- '@volar/language-core': 2.4.0-alpha.15
+ '@vitest/pretty-format': 2.1.3
+ magic-string: 0.30.12
+ pathe: 1.1.2
+
+ '@vitest/spy@2.1.3':
+ dependencies:
+ tinyspy: 3.0.2
+
+ '@vitest/utils@2.1.3':
+ dependencies:
+ '@vitest/pretty-format': 2.1.3
+ loupe: 3.1.2
+ tinyrainbow: 1.2.0
+
+ '@volar/language-core@2.4.8':
+ dependencies:
+ '@volar/source-map': 2.4.8
+
+ '@volar/source-map@2.4.8': {}
+
+ '@volar/typescript@2.4.8':
+ dependencies:
+ '@volar/language-core': 2.4.8
path-browserify: 1.0.1
vscode-uri: 3.0.8
- '@vue/compiler-core@3.4.32':
+ '@vue/compiler-core@3.5.12':
dependencies:
- '@babel/parser': 7.24.8
- '@vue/shared': 3.4.32
+ '@babel/parser': 7.25.8
+ '@vue/shared': 3.5.12
entities: 4.5.0
estree-walker: 2.0.2
- source-map-js: 1.2.0
+ source-map-js: 1.2.1
- '@vue/compiler-dom@3.4.32':
+ '@vue/compiler-dom@3.5.12':
dependencies:
- '@vue/compiler-core': 3.4.32
- '@vue/shared': 3.4.32
+ '@vue/compiler-core': 3.5.12
+ '@vue/shared': 3.5.12
- '@vue/compiler-sfc@3.4.32':
+ '@vue/compiler-sfc@3.5.12':
dependencies:
- '@babel/parser': 7.24.8
- '@vue/compiler-core': 3.4.32
- '@vue/compiler-dom': 3.4.32
- '@vue/compiler-ssr': 3.4.32
- '@vue/shared': 3.4.32
+ '@babel/parser': 7.25.8
+ '@vue/compiler-core': 3.5.12
+ '@vue/compiler-dom': 3.5.12
+ '@vue/compiler-ssr': 3.5.12
+ '@vue/shared': 3.5.12
estree-walker: 2.0.2
- magic-string: 0.30.10
- postcss: 8.4.39
- source-map-js: 1.2.0
+ magic-string: 0.30.12
+ postcss: 8.4.47
+ source-map-js: 1.2.1
- '@vue/compiler-ssr@3.4.32':
+ '@vue/compiler-ssr@3.5.12':
dependencies:
- '@vue/compiler-dom': 3.4.32
- '@vue/shared': 3.4.32
+ '@vue/compiler-dom': 3.5.12
+ '@vue/shared': 3.5.12
- '@vue/devtools-api@6.6.3': {}
-
- '@vue/language-core@2.0.26(typescript@5.5.3)':
+ '@vue/compiler-vue2@2.7.16':
dependencies:
- '@volar/language-core': 2.4.0-alpha.15
- '@vue/compiler-dom': 3.4.32
- '@vue/shared': 3.4.32
- computeds: 0.0.1
+ de-indent: 1.0.2
+ he: 1.2.0
+
+ '@vue/devtools-api@6.6.4': {}
+
+ '@vue/language-core@2.1.8(typescript@5.6.3)':
+ dependencies:
+ '@volar/language-core': 2.4.8
+ '@vue/compiler-dom': 3.5.12
+ '@vue/compiler-vue2': 2.7.16
+ '@vue/shared': 3.5.12
+ alien-signals: 0.2.0
minimatch: 9.0.5
muggle-string: 0.4.1
path-browserify: 1.0.1
- vue-template-compiler: 2.7.16
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
- '@vue/reactivity@3.4.32':
+ '@vue/reactivity@3.5.12':
dependencies:
- '@vue/shared': 3.4.32
+ '@vue/shared': 3.5.12
- '@vue/runtime-core@3.4.32':
+ '@vue/runtime-core@3.5.12':
dependencies:
- '@vue/reactivity': 3.4.32
- '@vue/shared': 3.4.32
+ '@vue/reactivity': 3.5.12
+ '@vue/shared': 3.5.12
- '@vue/runtime-dom@3.4.32':
+ '@vue/runtime-dom@3.5.12':
dependencies:
- '@vue/reactivity': 3.4.32
- '@vue/runtime-core': 3.4.32
- '@vue/shared': 3.4.32
+ '@vue/reactivity': 3.5.12
+ '@vue/runtime-core': 3.5.12
+ '@vue/shared': 3.5.12
csstype: 3.1.3
- '@vue/server-renderer@3.4.32(vue@3.4.32(typescript@5.5.3))':
+ '@vue/server-renderer@3.5.12(vue@3.5.12(typescript@5.6.3))':
dependencies:
- '@vue/compiler-ssr': 3.4.32
- '@vue/shared': 3.4.32
- vue: 3.4.32(typescript@5.5.3)
+ '@vue/compiler-ssr': 3.5.12
+ '@vue/shared': 3.5.12
+ vue: 3.5.12(typescript@5.6.3)
- '@vue/shared@3.4.32': {}
+ '@vue/shared@3.5.12': {}
'@vue/test-utils@2.4.6':
dependencies:
js-beautify: 1.15.1
- vue-component-type-helpers: 2.0.26
+ vue-component-type-helpers: 2.1.6
- '@vueuse/core@10.11.0(vue@3.4.32(typescript@5.5.3))':
+ '@vueuse/core@11.1.0(vue@3.5.12(typescript@5.6.3))':
dependencies:
'@types/web-bluetooth': 0.0.20
- '@vueuse/metadata': 10.11.0
- '@vueuse/shared': 10.11.0(vue@3.4.32(typescript@5.5.3))
- vue-demi: 0.14.8(vue@3.4.32(typescript@5.5.3))
+ '@vueuse/metadata': 11.1.0
+ '@vueuse/shared': 11.1.0(vue@3.5.12(typescript@5.6.3))
+ vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
- '@vueuse/metadata@10.11.0': {}
+ '@vueuse/metadata@11.1.0': {}
- '@vueuse/shared@10.11.0(vue@3.4.32(typescript@5.5.3))':
+ '@vueuse/shared@11.1.0(vue@3.5.12(typescript@5.6.3))':
dependencies:
- vue-demi: 0.14.8(vue@3.4.32(typescript@5.5.3))
+ vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
'@windicss/config@1.9.3':
dependencies:
- debug: 4.3.5
+ debug: 4.3.7
jiti: 1.21.6
windicss: 3.5.6
transitivePeerDependencies:
@@ -3927,25 +3781,25 @@ snapshots:
dependencies:
'@antfu/utils': 0.7.10
'@windicss/config': 1.9.3
- debug: 4.3.5
+ debug: 4.3.7
fast-glob: 3.3.2
- magic-string: 0.30.10
- micromatch: 4.0.7
+ magic-string: 0.30.12
+ micromatch: 4.0.8
windicss: 3.5.6
transitivePeerDependencies:
- supports-color
abbrev@2.0.0: {}
- acorn-jsx@5.3.2(acorn@8.12.1):
+ acorn-jsx@5.3.2(acorn@8.13.0):
dependencies:
- acorn: 8.12.1
+ acorn: 8.13.0
- acorn@8.12.1: {}
+ acorn@8.13.0: {}
agent-base@7.1.1:
dependencies:
- debug: 4.3.5
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
@@ -3956,9 +3810,11 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
+ alien-signals@0.2.0: {}
+
ansi-regex@5.0.1: {}
- ansi-regex@6.0.1: {}
+ ansi-regex@6.1.0: {}
ansi-styles@3.2.1:
dependencies:
@@ -3972,11 +3828,6 @@ snapshots:
ansi_up@6.0.2: {}
- anymatch@3.1.3:
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
-
are-docs-informative@0.0.2: {}
argparse@2.0.1: {}
@@ -3995,8 +3846,6 @@ snapshots:
balanced-match@1.0.2: {}
- binary-extensions@2.3.0: {}
-
boolbase@1.0.0: {}
brace-expansion@1.1.11:
@@ -4012,38 +3861,29 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browserslist@4.23.1:
+ browserslist@4.24.0:
dependencies:
- caniuse-lite: 1.0.30001640
- electron-to-chromium: 1.4.817
- node-releases: 2.0.14
- update-browserslist-db: 1.1.0(browserslist@4.23.1)
-
- browserslist@4.23.2:
- dependencies:
- caniuse-lite: 1.0.30001642
- electron-to-chromium: 1.4.829
- node-releases: 2.0.17
- update-browserslist-db: 1.1.0(browserslist@4.23.2)
+ caniuse-lite: 1.0.30001667
+ electron-to-chromium: 1.5.32
+ node-releases: 2.0.18
+ update-browserslist-db: 1.1.1(browserslist@4.24.0)
builtin-modules@3.3.0: {}
cac@6.7.14: {}
- call-me-maybe@1.0.2: {}
-
callsites@3.1.0: {}
- caniuse-lite@1.0.30001640: {}
+ caniuse-lite@1.0.30001667: {}
- caniuse-lite@1.0.30001642: {}
+ ccount@2.0.1: {}
chai@5.1.1:
dependencies:
assertion-error: 2.0.1
check-error: 2.1.1
deep-eql: 5.0.2
- loupe: 3.1.1
+ loupe: 3.1.2
pathval: 2.0.0
chalk@2.4.2:
@@ -4061,26 +3901,10 @@ snapshots:
char-regex@1.0.2: {}
- character-entities-legacy@1.1.4: {}
-
- character-entities@1.2.4: {}
-
- character-reference-invalid@1.1.4: {}
+ character-entities@2.0.2: {}
check-error@2.1.1: {}
- chokidar@3.6.0:
- dependencies:
- anymatch: 3.1.3
- braces: 3.0.3
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.3
-
ci-info@4.0.0: {}
clean-regexp@1.0.0:
@@ -4115,11 +3939,9 @@ snapshots:
comment-parser@1.4.1: {}
- computeds@0.0.1: {}
-
concat-map@0.0.1: {}
- confbox@0.1.7: {}
+ confbox@0.1.8: {}
config-chain@1.1.13:
dependencies:
@@ -4128,9 +3950,9 @@ snapshots:
convert-source-map@2.0.0: {}
- core-js-compat@3.37.1:
+ core-js-compat@3.38.1:
dependencies:
- browserslist: 4.23.2
+ browserslist: 4.24.0
cross-spawn@7.0.3:
dependencies:
@@ -4149,12 +3971,12 @@ snapshots:
css-tree@2.2.1:
dependencies:
mdn-data: 2.0.28
- source-map-js: 1.2.0
+ source-map-js: 1.2.1
css-tree@2.3.1:
dependencies:
mdn-data: 2.0.30
- source-map-js: 1.2.0
+ source-map-js: 1.2.1
css-what@6.1.0: {}
@@ -4170,9 +3992,9 @@ snapshots:
dependencies:
css-tree: 2.2.1
- cssstyle@4.0.1:
+ cssstyle@4.1.0:
dependencies:
- rrweb-cssom: 0.6.0
+ rrweb-cssom: 0.7.1
csstype@3.1.3: {}
@@ -4181,7 +4003,7 @@ snapshots:
whatwg-mimetype: 4.0.0
whatwg-url: 14.0.0
- dayjs@1.11.12: {}
+ dayjs@1.11.13: {}
de-indent@1.0.2: {}
@@ -4189,12 +4011,16 @@ snapshots:
dependencies:
ms: 2.1.3
- debug@4.3.5:
+ debug@4.3.7:
dependencies:
- ms: 2.1.2
+ ms: 2.1.3
decimal.js@10.4.3: {}
+ decode-named-character-reference@1.0.2:
+ dependencies:
+ character-entities: 2.0.2
+
decode-uri-component@0.2.2: {}
deep-eql@5.0.2: {}
@@ -4203,6 +4029,12 @@ snapshots:
delayed-stream@1.0.0: {}
+ dequal@2.0.3: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
dir-glob@3.0.1:
dependencies:
path-type: 4.0.0
@@ -4238,9 +4070,7 @@ snapshots:
minimatch: 9.0.1
semver: 7.6.3
- electron-to-chromium@1.4.817: {}
-
- electron-to-chromium@1.4.829: {}
+ electron-to-chromium@1.5.32: {}
emoji-regex@8.0.0: {}
@@ -4248,7 +4078,7 @@ snapshots:
emojilib@2.4.0: {}
- enhanced-resolve@5.17.0:
+ enhanced-resolve@5.17.1:
dependencies:
graceful-fs: 4.2.11
tapable: 2.2.1
@@ -4287,12 +4117,14 @@ snapshots:
'@esbuild/win32-ia32': 0.21.5
'@esbuild/win32-x64': 0.21.5
- escalade@3.1.2: {}
+ escalade@3.2.0: {}
escape-string-regexp@1.0.5: {}
escape-string-regexp@4.0.0: {}
+ escape-string-regexp@5.0.0: {}
+
escodegen@2.1.0:
dependencies:
esprima: 4.0.1
@@ -4301,169 +4133,157 @@ snapshots:
optionalDependencies:
source-map: 0.6.1
- eslint-compat-utils@0.5.1(eslint@9.7.0):
+ eslint-compat-utils@0.5.1(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- eslint: 9.7.0
+ eslint: 9.13.0(jiti@1.21.6)
semver: 7.6.3
- eslint-config-flat-gitignore@0.1.8:
+ eslint-config-flat-gitignore@0.3.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
+ '@eslint/compat': 1.2.1(eslint@9.13.0(jiti@1.21.6))
+ eslint: 9.13.0(jiti@1.21.6)
find-up-simple: 1.0.0
- parse-gitignore: 2.0.0
- eslint-flat-config-utils@0.2.5:
+ eslint-flat-config-utils@0.4.0:
dependencies:
- '@types/eslint': 8.56.10
pathe: 1.1.2
eslint-import-resolver-node@0.3.9:
dependencies:
debug: 3.2.7
- is-core-module: 2.15.0
+ is-core-module: 2.15.1
resolve: 1.22.8
transitivePeerDependencies:
- supports-color
- eslint-merge-processors@0.1.0(eslint@9.7.0):
+ eslint-merge-processors@0.1.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- eslint: 9.7.0
+ eslint: 9.13.0(jiti@1.21.6)
- eslint-plugin-antfu@2.3.4(eslint@9.7.0):
+ eslint-plugin-antfu@2.7.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
'@antfu/utils': 0.7.10
- eslint: 9.7.0
+ eslint: 9.13.0(jiti@1.21.6)
- eslint-plugin-command@0.2.3(eslint@9.7.0):
+ eslint-plugin-command@0.2.6(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- '@es-joy/jsdoccomment': 0.43.1
- eslint: 9.7.0
+ '@es-joy/jsdoccomment': 0.48.0
+ eslint: 9.13.0(jiti@1.21.6)
- eslint-plugin-es-x@7.8.0(eslint@9.7.0):
+ eslint-plugin-es-x@7.8.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- '@eslint-community/regexpp': 4.11.0
- eslint: 9.7.0
- eslint-compat-utils: 0.5.1(eslint@9.7.0)
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ '@eslint-community/regexpp': 4.11.1
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.6))
- eslint-plugin-eslint-comments@3.2.0(eslint@9.7.0):
+ eslint-plugin-import-x@4.3.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3):
dependencies:
- escape-string-regexp: 1.0.5
- eslint: 9.7.0
- ignore: 5.3.1
-
- eslint-plugin-import-x@3.0.1(eslint@9.7.0)(typescript@5.5.3):
- dependencies:
- '@rtsao/scc': 1.1.0
- '@typescript-eslint/utils': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- debug: 4.3.5
+ '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ debug: 4.3.7
doctrine: 3.0.0
- eslint: 9.7.0
+ eslint: 9.13.0(jiti@1.21.6)
eslint-import-resolver-node: 0.3.9
- get-tsconfig: 4.7.5
+ get-tsconfig: 4.8.1
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
stable-hash: 0.0.4
- tslib: 2.6.3
+ tslib: 2.8.0
transitivePeerDependencies:
- supports-color
- typescript
- eslint-plugin-jsdoc@48.7.0(eslint@9.7.0):
+ eslint-plugin-jsdoc@50.4.3(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- '@es-joy/jsdoccomment': 0.46.0
+ '@es-joy/jsdoccomment': 0.49.0
are-docs-informative: 0.0.2
comment-parser: 1.4.1
- debug: 4.3.5
+ debug: 4.3.7
escape-string-regexp: 4.0.0
- eslint: 9.7.0
+ eslint: 9.13.0(jiti@1.21.6)
+ espree: 10.2.0
esquery: 1.6.0
- parse-imports: 2.1.1
+ parse-imports: 2.2.1
semver: 7.6.3
spdx-expression-parse: 4.0.0
- synckit: 0.9.1
+ synckit: 0.9.2
transitivePeerDependencies:
- supports-color
- eslint-plugin-jsonc@2.16.0(eslint@9.7.0):
+ eslint-plugin-jsonc@2.16.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- eslint: 9.7.0
- eslint-compat-utils: 0.5.1(eslint@9.7.0)
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.6))
espree: 9.6.1
graphemer: 1.4.0
jsonc-eslint-parser: 2.4.0
natural-compare: 1.4.0
synckit: 0.6.2
- eslint-plugin-markdown@5.1.0(eslint@9.7.0):
+ eslint-plugin-n@17.11.1(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- eslint: 9.7.0
- mdast-util-from-markdown: 0.8.5
- transitivePeerDependencies:
- - supports-color
-
- eslint-plugin-n@17.9.0(eslint@9.7.0):
- dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- enhanced-resolve: 5.17.0
- eslint: 9.7.0
- eslint-plugin-es-x: 7.8.0(eslint@9.7.0)
- get-tsconfig: 4.7.5
- globals: 15.8.0
- ignore: 5.3.1
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ enhanced-resolve: 5.17.1
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-plugin-es-x: 7.8.0(eslint@9.13.0(jiti@1.21.6))
+ get-tsconfig: 4.8.1
+ globals: 15.11.0
+ ignore: 5.3.2
minimatch: 9.0.5
semver: 7.6.3
- eslint-plugin-no-only-tests@3.1.0: {}
+ eslint-plugin-no-only-tests@3.3.0: {}
- eslint-plugin-perfectionist@2.11.0(eslint@9.7.0)(typescript@5.5.3)(vue-eslint-parser@9.4.3(eslint@9.7.0)):
+ eslint-plugin-perfectionist@3.9.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)(vue-eslint-parser@9.4.3(eslint@9.13.0(jiti@1.21.6))):
dependencies:
- '@typescript-eslint/utils': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- eslint: 9.7.0
+ '@typescript-eslint/types': 8.10.0
+ '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
+ eslint: 9.13.0(jiti@1.21.6)
minimatch: 9.0.5
natural-compare-lite: 1.4.0
optionalDependencies:
- vue-eslint-parser: 9.4.3(eslint@9.7.0)
+ vue-eslint-parser: 9.4.3(eslint@9.13.0(jiti@1.21.6))
transitivePeerDependencies:
- supports-color
- typescript
- eslint-plugin-promise@6.4.0(eslint@9.7.0):
+ eslint-plugin-promise@7.1.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- eslint: 9.7.0
+ eslint: 9.13.0(jiti@1.21.6)
- eslint-plugin-regexp@2.6.0(eslint@9.7.0):
+ eslint-plugin-regexp@2.6.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- '@eslint-community/regexpp': 4.11.0
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ '@eslint-community/regexpp': 4.11.1
comment-parser: 1.4.1
- eslint: 9.7.0
- jsdoc-type-pratt-parser: 4.0.0
+ eslint: 9.13.0(jiti@1.21.6)
+ jsdoc-type-pratt-parser: 4.1.0
refa: 0.12.1
regexp-ast-analysis: 0.7.1
scslre: 0.3.0
- eslint-plugin-toml@0.11.1(eslint@9.7.0):
+ eslint-plugin-toml@0.11.1(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- debug: 4.3.5
- eslint: 9.7.0
- eslint-compat-utils: 0.5.1(eslint@9.7.0)
+ debug: 4.3.7
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.6))
lodash: 4.17.21
toml-eslint-parser: 0.10.0
transitivePeerDependencies:
- supports-color
- eslint-plugin-unicorn@54.0.0(eslint@9.7.0):
+ eslint-plugin-unicorn@56.0.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- '@babel/helper-validator-identifier': 7.24.7
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- '@eslint/eslintrc': 3.1.0
+ '@babel/helper-validator-identifier': 7.25.7
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
ci-info: 4.0.0
clean-regexp: 1.0.0
- core-js-compat: 3.37.1
- eslint: 9.7.0
+ core-js-compat: 3.38.1
+ eslint: 9.13.0(jiti@1.21.6)
esquery: 1.6.0
+ globals: 15.11.0
indent-string: 4.0.0
is-builtin-module: 3.2.1
jsesc: 3.0.2
@@ -4473,130 +4293,124 @@ snapshots:
regjsparser: 0.10.0
semver: 7.6.3
strip-indent: 3.0.0
- transitivePeerDependencies:
- - supports-color
- eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@2.0.3(@types/node@20.14.11)(jsdom@24.1.0)(stylus@0.57.0)):
+ eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- '@typescript-eslint/utils': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- eslint: 9.7.0
+ eslint: 9.13.0(jiti@1.21.6)
optionalDependencies:
- '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)
- vitest: 2.0.3(@types/node@20.14.11)(jsdom@24.1.0)(stylus@0.57.0)
- transitivePeerDependencies:
- - supports-color
- - typescript
+ '@typescript-eslint/eslint-plugin': 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3)
- eslint-plugin-vue-scoped-css@2.8.1(eslint@9.7.0)(vue-eslint-parser@9.4.3(eslint@9.7.0)):
+ eslint-plugin-vue-scoped-css@2.8.1(eslint@9.13.0(jiti@1.21.6))(vue-eslint-parser@9.4.3(eslint@9.13.0(jiti@1.21.6))):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- eslint: 9.7.0
- eslint-compat-utils: 0.5.1(eslint@9.7.0)
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.6))
lodash: 4.17.21
- postcss: 8.4.39
- postcss-safe-parser: 6.0.0(postcss@8.4.39)
- postcss-scss: 4.0.9(postcss@8.4.39)
- postcss-selector-parser: 6.1.0
+ postcss: 8.4.47
+ postcss-safe-parser: 6.0.0(postcss@8.4.47)
+ postcss-scss: 4.0.9(postcss@8.4.47)
+ postcss-selector-parser: 6.1.2
postcss-styl: 0.12.3
- vue-eslint-parser: 9.4.3(eslint@9.7.0)
+ vue-eslint-parser: 9.4.3(eslint@9.13.0(jiti@1.21.6))
transitivePeerDependencies:
- supports-color
- eslint-plugin-vue@9.27.0(eslint@9.7.0):
+ eslint-plugin-vue@9.29.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- eslint: 9.7.0
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ eslint: 9.13.0(jiti@1.21.6)
globals: 13.24.0
natural-compare: 1.4.0
nth-check: 2.1.1
- postcss-selector-parser: 6.1.1
+ postcss-selector-parser: 6.1.2
semver: 7.6.3
- vue-eslint-parser: 9.4.3(eslint@9.7.0)
+ vue-eslint-parser: 9.4.3(eslint@9.13.0(jiti@1.21.6))
xml-name-validator: 4.0.0
transitivePeerDependencies:
- supports-color
- eslint-plugin-yml@1.14.0(eslint@9.7.0):
+ eslint-plugin-yml@1.14.0(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- debug: 4.3.5
- eslint: 9.7.0
- eslint-compat-utils: 0.5.1(eslint@9.7.0)
+ debug: 4.3.7
+ eslint: 9.13.0(jiti@1.21.6)
+ eslint-compat-utils: 0.5.1(eslint@9.13.0(jiti@1.21.6))
lodash: 4.17.21
natural-compare: 1.4.0
yaml-eslint-parser: 1.2.3
transitivePeerDependencies:
- supports-color
- eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.32)(eslint@9.7.0):
+ eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.5.12)(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- '@vue/compiler-sfc': 3.4.32
- eslint: 9.7.0
-
- eslint-rule-composer@0.3.0: {}
+ '@vue/compiler-sfc': 3.5.12
+ eslint: 9.13.0(jiti@1.21.6)
eslint-scope@7.2.2:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
- eslint-scope@8.0.2:
+ eslint-scope@8.1.0:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
eslint-visitor-keys@3.4.3: {}
- eslint-visitor-keys@4.0.0: {}
+ eslint-visitor-keys@4.1.0: {}
- eslint@9.7.0:
+ eslint@9.13.0(jiti@1.21.6):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0)
- '@eslint-community/regexpp': 4.11.0
- '@eslint/config-array': 0.17.0
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@1.21.6))
+ '@eslint-community/regexpp': 4.11.1
+ '@eslint/config-array': 0.18.0
+ '@eslint/core': 0.7.0
'@eslint/eslintrc': 3.1.0
- '@eslint/js': 9.7.0
+ '@eslint/js': 9.13.0
+ '@eslint/plugin-kit': 0.2.1
+ '@humanfs/node': 0.16.5
'@humanwhocodes/module-importer': 1.0.1
- '@humanwhocodes/retry': 0.3.0
- '@nodelib/fs.walk': 1.2.8
+ '@humanwhocodes/retry': 0.3.1
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
- debug: 4.3.5
+ debug: 4.3.7
escape-string-regexp: 4.0.0
- eslint-scope: 8.0.2
- eslint-visitor-keys: 4.0.0
- espree: 10.1.0
+ eslint-scope: 8.1.0
+ eslint-visitor-keys: 4.1.0
+ espree: 10.2.0
esquery: 1.6.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
- ignore: 5.3.1
+ ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
- is-path-inside: 3.0.3
json-stable-stringify-without-jsonify: 1.0.1
- levn: 0.4.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.4
- strip-ansi: 6.0.1
text-table: 0.2.0
+ optionalDependencies:
+ jiti: 1.21.6
transitivePeerDependencies:
- supports-color
- espree@10.1.0:
+ espree@10.2.0:
dependencies:
- acorn: 8.12.1
- acorn-jsx: 5.3.2(acorn@8.12.1)
- eslint-visitor-keys: 4.0.0
+ acorn: 8.13.0
+ acorn-jsx: 5.3.2(acorn@8.13.0)
+ eslint-visitor-keys: 4.1.0
espree@9.6.1:
dependencies:
- acorn: 8.12.1
- acorn-jsx: 5.3.2(acorn@8.12.1)
+ acorn: 8.13.0
+ acorn-jsx: 5.3.2(acorn@8.13.0)
eslint-visitor-keys: 3.4.3
esprima@4.0.1: {}
@@ -4615,22 +4429,10 @@ snapshots:
estree-walker@3.0.3:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
esutils@2.0.3: {}
- execa@8.0.1:
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 8.0.1
- human-signals: 5.0.0
- is-stream: 3.0.0
- merge-stream: 2.0.0
- npm-run-path: 5.3.0
- onetime: 6.0.0
- signal-exit: 4.1.0
- strip-final-newline: 3.0.0
-
fast-deep-equal@3.1.3: {}
fast-diff@1.3.0: {}
@@ -4641,7 +4443,7 @@ snapshots:
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
- micromatch: 4.0.7
+ micromatch: 4.0.8
fast-json-stable-stringify@2.1.0: {}
@@ -4678,7 +4480,7 @@ snapshots:
flatted@3.3.1: {}
- foreground-child@3.2.1:
+ foreground-child@3.3.0:
dependencies:
cross-spawn: 7.0.3
signal-exit: 4.1.0
@@ -4702,11 +4504,7 @@ snapshots:
get-caller-file@2.0.5: {}
- get-func-name@2.0.2: {}
-
- get-stream@8.0.1: {}
-
- get-tsconfig@4.7.5:
+ get-tsconfig@4.8.1:
dependencies:
resolve-pkg-maps: 1.0.0
@@ -4718,13 +4516,13 @@ snapshots:
dependencies:
is-glob: 4.0.3
- glob@10.4.2:
+ glob@10.4.5:
dependencies:
- foreground-child: 3.2.1
- jackspeak: 3.4.0
+ foreground-child: 3.3.0
+ jackspeak: 3.4.3
minimatch: 9.0.5
minipass: 7.1.2
- package-json-from-dist: 1.0.0
+ package-json-from-dist: 1.0.1
path-scurry: 1.11.1
glob@7.2.3:
@@ -4744,14 +4542,16 @@ snapshots:
globals@14.0.0: {}
- globals@15.8.0: {}
+ globals@15.10.0: {}
+
+ globals@15.11.0: {}
globby@11.1.0:
dependencies:
array-union: 2.1.0
dir-glob: 3.0.1
fast-glob: 3.3.2
- ignore: 5.3.1
+ ignore: 5.3.2
merge2: 1.4.1
slash: 3.0.0
@@ -4778,24 +4578,22 @@ snapshots:
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.1
- debug: 4.3.5
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
https-proxy-agent@7.0.5:
dependencies:
agent-base: 7.1.1
- debug: 4.3.5
+ debug: 4.3.7
transitivePeerDependencies:
- supports-color
- human-signals@5.0.0: {}
-
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
- ignore@5.3.1: {}
+ ignore@5.3.2: {}
import-fresh@3.3.0:
dependencies:
@@ -4815,29 +4613,16 @@ snapshots:
ini@1.3.8: {}
- is-alphabetical@1.0.4: {}
-
- is-alphanumerical@1.0.4:
- dependencies:
- is-alphabetical: 1.0.4
- is-decimal: 1.0.4
-
is-arrayish@0.2.1: {}
- is-binary-path@2.1.0:
- dependencies:
- binary-extensions: 2.3.0
-
is-builtin-module@3.2.1:
dependencies:
builtin-modules: 3.3.0
- is-core-module@2.15.0:
+ is-core-module@2.15.1:
dependencies:
hasown: 2.0.2
- is-decimal@1.0.4: {}
-
is-extglob@2.1.1: {}
is-fullwidth-code-point@3.0.0: {}
@@ -4846,23 +4631,17 @@ snapshots:
dependencies:
is-extglob: 2.1.1
- is-hexadecimal@1.0.4: {}
-
is-language-code@3.1.0:
dependencies:
- '@babel/runtime': 7.24.7
+ '@babel/runtime': 7.25.7
is-number@7.0.0: {}
- is-path-inside@3.0.3: {}
-
is-potential-custom-element-name@1.0.1: {}
- is-stream@3.0.0: {}
-
isexe@2.0.0: {}
- jackspeak@3.4.0:
+ jackspeak@3.4.3:
dependencies:
'@isaacs/cliui': 8.0.2
optionalDependencies:
@@ -4876,7 +4655,7 @@ snapshots:
dependencies:
config-chain: 1.1.13
editorconfig: 1.0.4
- glob: 10.4.2
+ glob: 10.4.5
js-cookie: 3.0.5
nopt: 7.2.1
@@ -4888,11 +4667,11 @@ snapshots:
dependencies:
argparse: 2.0.1
- jsdoc-type-pratt-parser@4.0.0: {}
+ jsdoc-type-pratt-parser@4.1.0: {}
- jsdom@24.1.0:
+ jsdom@25.0.1:
dependencies:
- cssstyle: 4.0.1
+ cssstyle: 4.1.0
data-urls: 5.0.0
decimal.js: 10.4.3
form-data: 4.0.0
@@ -4900,12 +4679,12 @@ snapshots:
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.5
is-potential-custom-element-name: 1.0.1
- nwsapi: 2.2.10
+ nwsapi: 2.2.13
parse5: 7.1.2
rrweb-cssom: 0.7.1
saxes: 6.0.0
symbol-tree: 3.2.4
- tough-cookie: 4.1.4
+ tough-cookie: 5.0.0
w3c-xmlserializer: 5.0.0
webidl-conversions: 7.0.0
whatwg-encoding: 3.1.1
@@ -4920,8 +4699,6 @@ snapshots:
jsesc@0.5.0: {}
- jsesc@2.5.2: {}
-
jsesc@3.0.2: {}
json-buffer@3.0.1: {}
@@ -4936,7 +4713,7 @@ snapshots:
jsonc-eslint-parser@2.4.0:
dependencies:
- acorn: 8.12.1
+ acorn: 8.13.0
eslint-visitor-keys: 3.4.3
espree: 9.6.1
semver: 7.6.3
@@ -4956,8 +4733,8 @@ snapshots:
local-pkg@0.5.0:
dependencies:
- mlly: 1.7.1
- pkg-types: 1.1.3
+ mlly: 1.7.2
+ pkg-types: 1.2.1
locate-path@5.0.0:
dependencies:
@@ -4973,48 +4750,321 @@ snapshots:
lodash@4.17.21: {}
- loupe@3.1.1:
- dependencies:
- get-func-name: 2.0.2
+ longest-streak@3.1.0: {}
- lru-cache@10.3.0: {}
+ loupe@3.1.2: {}
+
+ lru-cache@10.4.3: {}
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
- magic-string@0.30.10:
+ magic-string@0.30.12:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
- mdast-util-from-markdown@0.8.5:
+ markdown-table@3.0.3: {}
+
+ mdast-util-find-and-replace@3.0.1:
dependencies:
- '@types/mdast': 3.0.15
- mdast-util-to-string: 2.0.0
- micromark: 2.11.4
- parse-entities: 2.0.0
- unist-util-stringify-position: 2.0.3
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ mdast-util-from-markdown@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-decode-string: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ unist-util-stringify-position: 4.0.0
transitivePeerDependencies:
- supports-color
- mdast-util-to-string@2.0.0: {}
+ mdast-util-gfm-autolink-literal@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.1
+ micromark-util-character: 2.1.0
+
+ mdast-util-gfm-footnote@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.1
+ mdast-util-to-markdown: 2.1.0
+ micromark-util-normalize-identifier: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.1
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-table@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.3
+ mdast-util-from-markdown: 2.0.1
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.1
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm@3.0.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.1
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.0.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.0
+
+ mdast-util-to-markdown@2.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-decode-string: 2.0.0
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
mdn-data@2.0.28: {}
mdn-data@2.0.30: {}
- merge-stream@2.0.0: {}
-
merge2@1.4.1: {}
- micromark@2.11.4:
+ micromark-core-commonmark@2.0.1:
dependencies:
- debug: 4.3.5
- parse-entities: 2.0.0
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.0
+ micromark-factory-label: 2.0.0
+ micromark-factory-space: 2.0.0
+ micromark-factory-title: 2.0.0
+ micromark-factory-whitespace: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-html-tag-name: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-subtokenize: 2.0.1
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.1
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-classify-character: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-table@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-extension-gfm@3.0.0:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.0
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-destination@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-label@2.0.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-space@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-title@2.0.0:
+ dependencies:
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-factory-whitespace@2.0.0:
+ dependencies:
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-character@2.1.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-chunked@2.0.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-classify-character@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-combine-extensions@2.0.0:
+ dependencies:
+ micromark-util-chunked: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-decode-numeric-character-reference@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-decode-string@2.0.0:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 2.1.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-encode@2.0.0: {}
+
+ micromark-util-html-tag-name@2.0.0: {}
+
+ micromark-util-normalize-identifier@2.0.0:
+ dependencies:
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-resolve-all@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.0
+
+ micromark-util-sanitize-uri@2.0.0:
+ dependencies:
+ micromark-util-character: 2.1.0
+ micromark-util-encode: 2.0.0
+ micromark-util-symbol: 2.0.0
+
+ micromark-util-subtokenize@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+
+ micromark-util-symbol@2.0.0: {}
+
+ micromark-util-types@2.0.0: {}
+
+ micromark@4.0.0:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.3.7
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.1
+ micromark-factory-space: 2.0.0
+ micromark-util-character: 2.1.0
+ micromark-util-chunked: 2.0.0
+ micromark-util-combine-extensions: 2.0.0
+ micromark-util-decode-numeric-character-reference: 2.0.1
+ micromark-util-encode: 2.0.0
+ micromark-util-normalize-identifier: 2.0.0
+ micromark-util-resolve-all: 2.0.0
+ micromark-util-sanitize-uri: 2.0.0
+ micromark-util-subtokenize: 2.0.1
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
transitivePeerDependencies:
- supports-color
- micromatch@4.0.7:
+ micromatch@4.0.8:
dependencies:
braces: 3.0.3
picomatch: 2.3.1
@@ -5025,8 +5075,6 @@ snapshots:
dependencies:
mime-db: 1.52.0
- mimic-fn@4.0.0: {}
-
min-indent@1.0.1: {}
minimatch@3.1.2:
@@ -5045,12 +5093,17 @@ snapshots:
mlly@1.7.1:
dependencies:
- acorn: 8.12.1
+ acorn: 8.13.0
pathe: 1.1.2
- pkg-types: 1.1.3
+ pkg-types: 1.2.1
ufo: 1.5.4
- ms@2.1.2: {}
+ mlly@1.7.2:
+ dependencies:
+ acorn: 8.13.0
+ pathe: 1.1.2
+ pkg-types: 1.2.1
+ ufo: 1.5.4
ms@2.1.3: {}
@@ -5069,9 +5122,7 @@ snapshots:
emojilib: 2.4.0
skin-tone: 2.0.0
- node-releases@2.0.14: {}
-
- node-releases@2.0.17: {}
+ node-releases@2.0.18: {}
nopt@7.2.1:
dependencies:
@@ -5084,26 +5135,16 @@ snapshots:
semver: 7.6.3
validate-npm-package-license: 3.0.4
- normalize-path@3.0.0: {}
-
- npm-run-path@5.3.0:
- dependencies:
- path-key: 4.0.0
-
nth-check@2.1.1:
dependencies:
boolbase: 1.0.0
- nwsapi@2.2.10: {}
+ nwsapi@2.2.13: {}
once@1.4.0:
dependencies:
wrappy: 1.0.2
- onetime@6.0.0:
- dependencies:
- mimic-fn: 4.0.0
-
optionator@0.9.4:
dependencies:
deep-is: 0.1.4
@@ -5131,31 +5172,24 @@ snapshots:
p-try@2.2.0: {}
- package-json-from-dist@1.0.0: {}
+ package-json-from-dist@1.0.1: {}
+
+ package-manager-detector@0.2.2: {}
parent-module@1.0.1:
dependencies:
callsites: 3.1.0
- parse-entities@2.0.0:
- dependencies:
- character-entities: 1.2.4
- character-entities-legacy: 1.1.4
- character-reference-invalid: 1.1.4
- is-alphanumerical: 1.0.4
- is-decimal: 1.0.4
- is-hexadecimal: 1.0.4
-
parse-gitignore@2.0.0: {}
- parse-imports@2.1.1:
+ parse-imports@2.2.1:
dependencies:
es-module-lexer: 1.5.4
slashes: 3.0.12
parse-json@5.2.0:
dependencies:
- '@babel/code-frame': 7.24.7
+ '@babel/code-frame': 7.25.7
error-ex: 1.3.2
json-parse-even-better-errors: 2.3.1
lines-and-columns: 1.2.4
@@ -5172,13 +5206,11 @@ snapshots:
path-key@3.1.1: {}
- path-key@4.0.0: {}
-
path-parse@1.0.7: {}
path-scurry@1.11.1:
dependencies:
- lru-cache: 10.3.0
+ lru-cache: 10.4.3
minipass: 7.1.2
path-type@4.0.0: {}
@@ -5187,61 +5219,58 @@ snapshots:
pathval@2.0.0: {}
- picocolors@1.0.1: {}
+ picocolors@1.1.0: {}
+
+ picocolors@1.1.1: {}
picomatch@2.3.1: {}
picomatch@4.0.2: {}
- pinia@2.1.7(typescript@5.5.3)(vue@3.4.32(typescript@5.5.3)):
+ pinia@2.2.4(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)):
dependencies:
- '@vue/devtools-api': 6.6.3
- vue: 3.4.32(typescript@5.5.3)
- vue-demi: 0.14.8(vue@3.4.32(typescript@5.5.3))
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.12(typescript@5.6.3)
+ vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3))
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
- pkg-types@1.1.3:
+ pkg-types@1.2.1:
dependencies:
- confbox: 0.1.7
- mlly: 1.7.1
+ confbox: 0.1.8
+ mlly: 1.7.2
pathe: 1.1.2
pluralize@8.0.0: {}
- postcss-safe-parser@6.0.0(postcss@8.4.39):
+ postcss-safe-parser@6.0.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-scss@4.0.9(postcss@8.4.39):
+ postcss-scss@4.0.9(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-selector-parser@6.1.0:
- dependencies:
- cssesc: 3.0.0
- util-deprecate: 1.0.2
-
- postcss-selector-parser@6.1.1:
+ postcss-selector-parser@6.1.2:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
postcss-styl@0.12.3:
dependencies:
- debug: 4.3.5
+ debug: 4.3.7
fast-diff: 1.3.0
lodash.sortedlastindex: 4.1.0
- postcss: 8.4.39
+ postcss: 8.4.47
stylus: 0.57.0
transitivePeerDependencies:
- supports-color
- postcss@8.4.39:
+ postcss@8.4.47:
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
prelude-ls@1.2.1: {}
@@ -5251,12 +5280,8 @@ snapshots:
proto-list@1.2.4: {}
- psl@1.9.0: {}
-
punycode@2.3.1: {}
- querystringify@2.2.0: {}
-
queue-microtask@1.2.3: {}
read-pkg-up@7.0.1:
@@ -5272,19 +5297,15 @@ snapshots:
parse-json: 5.2.0
type-fest: 0.6.0
- readdirp@3.6.0:
- dependencies:
- picomatch: 2.3.1
-
refa@0.12.1:
dependencies:
- '@eslint-community/regexpp': 4.11.0
+ '@eslint-community/regexpp': 4.11.1
regenerator-runtime@0.14.1: {}
regexp-ast-analysis@0.7.1:
dependencies:
- '@eslint-community/regexpp': 4.11.0
+ '@eslint-community/regexpp': 4.11.1
refa: 0.12.1
regexp-tree@0.1.27: {}
@@ -5293,52 +5314,48 @@ snapshots:
dependencies:
jsesc: 0.5.0
- replace-in-file@8.1.0:
+ replace-in-file@8.2.0:
dependencies:
chalk: 5.3.0
- glob: 10.4.2
+ glob: 10.4.5
yargs: 17.7.2
require-directory@2.1.1: {}
- requires-port@1.0.0: {}
-
resolve-from@4.0.0: {}
resolve-pkg-maps@1.0.0: {}
resolve@1.22.8:
dependencies:
- is-core-module: 2.15.0
+ is-core-module: 2.15.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
reusify@1.0.4: {}
- rollup@4.18.1:
+ rollup@4.24.0:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.18.1
- '@rollup/rollup-android-arm64': 4.18.1
- '@rollup/rollup-darwin-arm64': 4.18.1
- '@rollup/rollup-darwin-x64': 4.18.1
- '@rollup/rollup-linux-arm-gnueabihf': 4.18.1
- '@rollup/rollup-linux-arm-musleabihf': 4.18.1
- '@rollup/rollup-linux-arm64-gnu': 4.18.1
- '@rollup/rollup-linux-arm64-musl': 4.18.1
- '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1
- '@rollup/rollup-linux-riscv64-gnu': 4.18.1
- '@rollup/rollup-linux-s390x-gnu': 4.18.1
- '@rollup/rollup-linux-x64-gnu': 4.18.1
- '@rollup/rollup-linux-x64-musl': 4.18.1
- '@rollup/rollup-win32-arm64-msvc': 4.18.1
- '@rollup/rollup-win32-ia32-msvc': 4.18.1
- '@rollup/rollup-win32-x64-msvc': 4.18.1
+ '@rollup/rollup-android-arm-eabi': 4.24.0
+ '@rollup/rollup-android-arm64': 4.24.0
+ '@rollup/rollup-darwin-arm64': 4.24.0
+ '@rollup/rollup-darwin-x64': 4.24.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.24.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.24.0
+ '@rollup/rollup-linux-arm64-gnu': 4.24.0
+ '@rollup/rollup-linux-arm64-musl': 4.24.0
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.24.0
+ '@rollup/rollup-linux-s390x-gnu': 4.24.0
+ '@rollup/rollup-linux-x64-gnu': 4.24.0
+ '@rollup/rollup-linux-x64-musl': 4.24.0
+ '@rollup/rollup-win32-arm64-msvc': 4.24.0
+ '@rollup/rollup-win32-ia32-msvc': 4.24.0
+ '@rollup/rollup-win32-x64-msvc': 4.24.0
fsevents: 2.3.3
- rrweb-cssom@0.6.0: {}
-
rrweb-cssom@0.7.1: {}
run-parallel@1.2.0:
@@ -5355,7 +5372,7 @@ snapshots:
scslre@0.3.0:
dependencies:
- '@eslint-community/regexpp': 4.11.0
+ '@eslint-community/regexpp': 4.11.1
refa: 0.12.1
regexp-ast-analysis: 0.7.1
@@ -5371,7 +5388,7 @@ snapshots:
signal-exit@4.1.0: {}
- simple-icons@12.4.0: {}
+ simple-icons@13.15.0: {}
sisteransi@1.0.5: {}
@@ -5383,7 +5400,7 @@ snapshots:
slashes@3.0.12: {}
- source-map-js@1.2.0: {}
+ source-map-js@1.2.1: {}
source-map-resolve@0.6.0:
dependencies:
@@ -5397,21 +5414,21 @@ snapshots:
spdx-correct@3.2.0:
dependencies:
spdx-expression-parse: 3.0.1
- spdx-license-ids: 3.0.18
+ spdx-license-ids: 3.0.20
spdx-exceptions@2.5.0: {}
spdx-expression-parse@3.0.1:
dependencies:
spdx-exceptions: 2.5.0
- spdx-license-ids: 3.0.18
+ spdx-license-ids: 3.0.20
spdx-expression-parse@4.0.0:
dependencies:
spdx-exceptions: 2.5.0
- spdx-license-ids: 3.0.18
+ spdx-license-ids: 3.0.20
- spdx-license-ids@3.0.18: {}
+ spdx-license-ids@3.0.20: {}
stable-hash@0.0.4: {}
@@ -5419,8 +5436,6 @@ snapshots:
std-env@3.7.0: {}
- string-argv@0.3.2: {}
-
string-width@4.2.3:
dependencies:
emoji-regex: 8.0.0
@@ -5439,9 +5454,7 @@ snapshots:
strip-ansi@7.1.0:
dependencies:
- ansi-regex: 6.0.1
-
- strip-final-newline@3.0.0: {}
+ ansi-regex: 6.1.0
strip-indent@3.0.0:
dependencies:
@@ -5452,7 +5465,7 @@ snapshots:
stylus@0.57.0:
dependencies:
css: 3.0.0
- debug: 4.3.5
+ debug: 4.3.7
glob: 7.2.3
safer-buffer: 2.1.2
sax: 1.2.4
@@ -5478,37 +5491,45 @@ snapshots:
css-tree: 2.3.1
css-what: 6.1.0
csso: 5.0.5
- picocolors: 1.0.1
+ picocolors: 1.1.0
symbol-tree@3.2.4: {}
synckit@0.6.2:
dependencies:
- tslib: 2.6.3
-
- synckit@0.9.0:
- dependencies:
- '@pkgr/core': 0.1.1
- tslib: 2.6.3
+ tslib: 2.8.0
synckit@0.9.1:
dependencies:
'@pkgr/core': 0.1.1
- tslib: 2.6.3
+ tslib: 2.7.0
+
+ synckit@0.9.2:
+ dependencies:
+ '@pkgr/core': 0.1.1
+ tslib: 2.8.0
tapable@2.2.1: {}
text-table@0.2.0: {}
- tinybench@2.8.0: {}
+ tinybench@2.9.0: {}
tinycolor2@1.6.0: {}
- tinypool@1.0.0: {}
+ tinyexec@0.3.1: {}
+
+ tinypool@1.0.1: {}
tinyrainbow@1.2.0: {}
- tinyspy@3.0.0: {}
+ tinyspy@3.0.2: {}
+
+ tldts-core@6.1.50: {}
+
+ tldts@6.1.50:
+ dependencies:
+ tldts-core: 6.1.50
to-fast-properties@2.0.0: {}
@@ -5520,88 +5541,74 @@ snapshots:
dependencies:
eslint-visitor-keys: 3.4.3
- tough-cookie@4.1.4:
+ tough-cookie@5.0.0:
dependencies:
- psl: 1.9.0
- punycode: 2.3.1
- universalify: 0.2.0
- url-parse: 1.5.10
+ tldts: 6.1.50
tr46@5.0.0:
dependencies:
punycode: 2.3.1
- ts-api-utils@1.3.0(typescript@5.5.3):
+ ts-api-utils@1.3.0(typescript@5.6.3):
dependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
- tslib@2.6.3: {}
+ tslib@2.7.0: {}
+
+ tslib@2.8.0: {}
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
- type-detect@4.0.8: {}
-
type-fest@0.20.2: {}
type-fest@0.6.0: {}
type-fest@0.8.1: {}
- typescript-eslint@7.16.1(eslint@9.7.0)(typescript@5.5.3):
- dependencies:
- '@typescript-eslint/eslint-plugin': 7.16.1(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/parser': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/utils': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
- eslint: 9.7.0
- optionalDependencies:
- typescript: 5.5.3
- transitivePeerDependencies:
- - supports-color
-
- typescript@5.5.3: {}
+ typescript@5.6.3: {}
ufo@1.5.4: {}
- undici-types@5.26.5: {}
+ undici-types@6.19.8: {}
unicode-emoji-modifier-base@1.0.0: {}
- unist-util-stringify-position@2.0.3:
+ unist-util-is@6.0.0:
dependencies:
- '@types/unist': 2.0.10
+ '@types/unist': 3.0.3
- universalify@0.2.0: {}
-
- unplugin@1.11.0:
+ unist-util-stringify-position@4.0.0:
dependencies:
- acorn: 8.12.1
- chokidar: 3.6.0
- webpack-sources: 3.2.3
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
+ unist-util-visit@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ unplugin@1.14.1:
+ dependencies:
+ acorn: 8.13.0
webpack-virtual-modules: 0.6.2
- update-browserslist-db@1.1.0(browserslist@4.23.1):
+ update-browserslist-db@1.1.1(browserslist@4.24.0):
dependencies:
- browserslist: 4.23.1
- escalade: 3.1.2
- picocolors: 1.0.1
-
- update-browserslist-db@1.1.0(browserslist@4.23.2):
- dependencies:
- browserslist: 4.23.2
- escalade: 3.1.2
- picocolors: 1.0.1
+ browserslist: 4.24.0
+ escalade: 3.2.0
+ picocolors: 1.1.1
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
- url-parse@1.5.10:
- dependencies:
- querystringify: 2.2.0
- requires-port: 1.0.0
-
util-deprecate@1.0.2: {}
validate-npm-package-license@3.0.4:
@@ -5609,18 +5616,18 @@ snapshots:
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
- vite-node@2.0.3(@types/node@20.14.11)(stylus@0.57.0):
+ vite-node@2.1.3(@types/node@20.17.1)(stylus@0.57.0):
dependencies:
cac: 6.7.14
- debug: 4.3.5
+ debug: 4.3.7
pathe: 1.1.2
- tinyrainbow: 1.2.0
- vite: 5.3.4(@types/node@20.14.11)(stylus@0.57.0)
+ vite: 5.4.10(@types/node@20.17.1)(stylus@0.57.0)
transitivePeerDependencies:
- '@types/node'
- less
- lightningcss
- sass
+ - sass-embedded
- stylus
- sugarss
- supports-color
@@ -5628,65 +5635,67 @@ snapshots:
vite-plugin-prismjs@0.0.11(prismjs@1.29.0):
dependencies:
- '@babel/core': 7.24.7
+ '@babel/core': 7.25.7
babel-plugin-prismjs: 2.1.0(prismjs@1.29.0)
transitivePeerDependencies:
- prismjs
- supports-color
- vite-plugin-windicss@1.9.3(vite@5.3.4(@types/node@20.14.11)(stylus@0.57.0)):
+ vite-plugin-windicss@1.9.3(vite@5.4.10(@types/node@20.17.1)(stylus@0.57.0)):
dependencies:
'@windicss/plugin-utils': 1.9.3
- debug: 4.3.5
+ debug: 4.3.7
kolorist: 1.8.0
- vite: 5.3.4(@types/node@20.14.11)(stylus@0.57.0)
+ vite: 5.4.10(@types/node@20.17.1)(stylus@0.57.0)
windicss: 3.5.6
transitivePeerDependencies:
- supports-color
- vite-svg-loader@5.1.0(vue@3.4.32(typescript@5.5.3)):
+ vite-svg-loader@5.1.0(vue@3.5.12(typescript@5.6.3)):
dependencies:
svgo: 3.3.2
- vue: 3.4.32(typescript@5.5.3)
+ vue: 3.5.12(typescript@5.6.3)
- vite@5.3.4(@types/node@20.14.11)(stylus@0.57.0):
+ vite@5.4.10(@types/node@20.17.1)(stylus@0.57.0):
dependencies:
esbuild: 0.21.5
- postcss: 8.4.39
- rollup: 4.18.1
+ postcss: 8.4.47
+ rollup: 4.24.0
optionalDependencies:
- '@types/node': 20.14.11
+ '@types/node': 20.17.1
fsevents: 2.3.3
stylus: 0.57.0
- vitest@2.0.3(@types/node@20.14.11)(jsdom@24.1.0)(stylus@0.57.0):
+ vitest@2.1.3(@types/node@20.17.1)(jsdom@25.0.1)(stylus@0.57.0):
dependencies:
- '@ampproject/remapping': 2.3.0
- '@vitest/expect': 2.0.3
- '@vitest/pretty-format': 2.0.3
- '@vitest/runner': 2.0.3
- '@vitest/snapshot': 2.0.3
- '@vitest/spy': 2.0.3
- '@vitest/utils': 2.0.3
+ '@vitest/expect': 2.1.3
+ '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.10(@types/node@20.17.1)(stylus@0.57.0))
+ '@vitest/pretty-format': 2.1.3
+ '@vitest/runner': 2.1.3
+ '@vitest/snapshot': 2.1.3
+ '@vitest/spy': 2.1.3
+ '@vitest/utils': 2.1.3
chai: 5.1.1
- debug: 4.3.5
- execa: 8.0.1
- magic-string: 0.30.10
+ debug: 4.3.7
+ magic-string: 0.30.12
pathe: 1.1.2
std-env: 3.7.0
- tinybench: 2.8.0
- tinypool: 1.0.0
+ tinybench: 2.9.0
+ tinyexec: 0.3.1
+ tinypool: 1.0.1
tinyrainbow: 1.2.0
- vite: 5.3.4(@types/node@20.14.11)(stylus@0.57.0)
- vite-node: 2.0.3(@types/node@20.14.11)(stylus@0.57.0)
+ vite: 5.4.10(@types/node@20.17.1)(stylus@0.57.0)
+ vite-node: 2.1.3(@types/node@20.17.1)(stylus@0.57.0)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/node': 20.14.11
- jsdom: 24.1.0
+ '@types/node': 20.17.1
+ jsdom: 25.0.1
transitivePeerDependencies:
- less
- lightningcss
+ - msw
- sass
+ - sass-embedded
- stylus
- sugarss
- supports-color
@@ -5694,16 +5703,16 @@ snapshots:
vscode-uri@3.0.8: {}
- vue-component-type-helpers@2.0.26: {}
+ vue-component-type-helpers@2.1.6: {}
- vue-demi@0.14.8(vue@3.4.32(typescript@5.5.3)):
+ vue-demi@0.14.10(vue@3.5.12(typescript@5.6.3)):
dependencies:
- vue: 3.4.32(typescript@5.5.3)
+ vue: 3.5.12(typescript@5.6.3)
- vue-eslint-parser@9.4.3(eslint@9.7.0):
+ vue-eslint-parser@9.4.3(eslint@9.13.0(jiti@1.21.6)):
dependencies:
- debug: 4.3.5
- eslint: 9.7.0
+ debug: 4.3.7
+ eslint: 9.13.0(jiti@1.21.6)
eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3
espree: 9.6.1
@@ -5713,39 +5722,34 @@ snapshots:
transitivePeerDependencies:
- supports-color
- vue-i18n@9.13.1(vue@3.4.32(typescript@5.5.3)):
+ vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)):
dependencies:
- '@intlify/core-base': 9.13.1
- '@intlify/shared': 9.13.1
- '@vue/devtools-api': 6.6.3
- vue: 3.4.32(typescript@5.5.3)
+ '@intlify/core-base': 10.0.4
+ '@intlify/shared': 10.0.4
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.12(typescript@5.6.3)
- vue-router@4.4.0(vue@3.4.32(typescript@5.5.3)):
+ vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)):
dependencies:
- '@vue/devtools-api': 6.6.3
- vue: 3.4.32(typescript@5.5.3)
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.12(typescript@5.6.3)
- vue-template-compiler@2.7.16:
+ vue-tsc@2.1.8(typescript@5.6.3):
dependencies:
- de-indent: 1.0.2
- he: 1.2.0
-
- vue-tsc@2.0.26(typescript@5.5.3):
- dependencies:
- '@volar/typescript': 2.4.0-alpha.15
- '@vue/language-core': 2.0.26(typescript@5.5.3)
+ '@volar/typescript': 2.4.8
+ '@vue/language-core': 2.1.8(typescript@5.6.3)
semver: 7.6.3
- typescript: 5.5.3
+ typescript: 5.6.3
- vue@3.4.32(typescript@5.5.3):
+ vue@3.5.12(typescript@5.6.3):
dependencies:
- '@vue/compiler-dom': 3.4.32
- '@vue/compiler-sfc': 3.4.32
- '@vue/runtime-dom': 3.4.32
- '@vue/server-renderer': 3.4.32(vue@3.4.32(typescript@5.5.3))
- '@vue/shared': 3.4.32
+ '@vue/compiler-dom': 3.5.12
+ '@vue/compiler-sfc': 3.5.12
+ '@vue/runtime-dom': 3.5.12
+ '@vue/server-renderer': 3.5.12(vue@3.5.12(typescript@5.6.3))
+ '@vue/shared': 3.5.12
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
w3c-xmlserializer@5.0.0:
dependencies:
@@ -5753,8 +5757,6 @@ snapshots:
webidl-conversions@7.0.0: {}
- webpack-sources@3.2.3: {}
-
webpack-virtual-modules@0.6.2: {}
whatwg-encoding@3.1.1:
@@ -5811,16 +5813,16 @@ snapshots:
dependencies:
eslint-visitor-keys: 3.4.3
lodash: 4.17.21
- yaml: 2.4.5
+ yaml: 2.6.0
- yaml@2.4.5: {}
+ yaml@2.6.0: {}
yargs-parser@21.1.1: {}
yargs@17.7.2:
dependencies:
cliui: 8.0.1
- escalade: 3.1.2
+ escalade: 3.2.0
get-caller-file: 2.0.5
require-directory: 2.1.1
string-width: 4.2.3
@@ -5828,3 +5830,5 @@ snapshots:
yargs-parser: 21.1.1
yocto-queue@0.1.0: {}
+
+ zwitch@2.0.4: {}
diff --git a/web/src/App.vue b/web/src/App.vue
index 90a04d174..98e0ffb41 100644
--- a/web/src/App.vue
+++ b/web/src/App.vue
@@ -31,7 +31,7 @@ const apiClient = useApiClient();
const { notify } = useNotifications();
const i18n = useI18n();
-// TODO reenable with eslint-plugin-promise eslint-disable-next-line promise/prefer-await-to-callbacks
+// eslint-disable-next-line promise/prefer-await-to-callbacks
apiClient.setErrorHandler((err) => {
if (err.status === 404) {
notify({ title: i18n.t('errors.not_found'), type: 'error' });
diff --git a/web/src/assets/locales/de.json b/web/src/assets/locales/de.json
index e8bdab397..5992761c6 100644
--- a/web/src/assets/locales/de.json
+++ b/web/src/assets/locales/de.json
@@ -39,7 +39,14 @@
"saved": "Agent gespeichert",
"show": "Agenten anzeigen",
"token": "Schlüssel",
- "version": "Version"
+ "version": "Version",
+ "org": {
+ "badge": "Organisation"
+ },
+ "custom_labels": {
+ "desc": "Die benutzerdefinierten Labels, die vom Agent-Administrator beim Start des Agenten festgelegt wurden.",
+ "custom_labels": "Benutzerdefinierte Labels"
+ }
},
"not_allowed": "Du darfst nicht auf die Server-Einstellungen zugreifen.",
"orgs": {
@@ -132,8 +139,8 @@
"users": "Benutzer"
},
"registries": {
- "desc": "Globale Register-Zugangsdaten können für private Images aller Pipelines verwendet werden.",
- "warning": "Diese Register-Zugangsdaten sind für alle Benutzer verfügbar."
+ "desc": "Globale Register-Zugangsdaten können hinzugefügt werden, um für private Images für alle Pipelines zu verwenden.",
+ "warning": "Diese Register-Zugangsdaten werden für alle Benutzer verfügbar sein."
}
}
},
@@ -141,7 +148,7 @@
"back": "Zurück",
"cancel": "Abbrechen",
"default": "Standard",
- "docs": "Docs",
+ "docs": "Dokumentation",
"documentation_for": "Dokumentation für „{topic}“",
"empty_list": "Keine {entity} gefunden!",
"errors": {
@@ -182,7 +189,10 @@
},
"settings": "Einstellungen",
"registries": {
- "desc": "Register-Zugangsdaten der Organisation können für private Images aller Organisations-Pipelines verwendet werden."
+ "desc": "Zugangsdaten zum Register der Organisation können für private Images aller Pipelines der Organisation verwendet werden."
+ },
+ "agents": {
+ "desc": "Agents registriert für diese Organisation."
}
}
},
@@ -221,12 +231,13 @@
"trigger": "Pipeline ausführen",
"variables": {
"add": "Variable hinzufügen",
- "desc": "Spezifiziere weitere Variablen für deine Pipeline. Vordefinierte Variablen mit dem selben Namen werden überschrieben.",
+ "desc": "Füge weitere Variablen für deine Pipeline hinzu. Vordefinierte Variablen mit demselben Namen werden überschrieben.",
"name": "Variablenname",
"title": "Zusätzliche Pipeline-Variablen",
"value": "Variablenwert",
"delete": "Variable löschen"
- }
+ },
+ "show_pipelines": "Pipelines anzeigen"
},
"not_allowed": "Zugriff auf dieses Repository nicht erlaubt",
"open_in_forge": "Repository in der Forge öffnen",
@@ -296,7 +307,17 @@
"log_delete_confirm": "Möchtest du die Logs diesen Schrittes wirklich löschen?",
"log_delete_error": "Es gab einen Fehler beim Löschen der Logs des Schrittes",
"duration": "Pipeline-Dauer",
- "created": "Erstellt: {created}"
+ "created": "Erstellt: {created}",
+ "no_logs": "Keine Logs",
+ "debug": {
+ "no_permission": "Du bist nicht berechtigt auf die Debug Informationen zuzugreifen.",
+ "download_metadata": "Metadaten herunterladen",
+ "metadata_download_successful": "Die Metadaten wurden erfolgreich heruntergeladen",
+ "metadata_download_error": "Fehler beim Herunterladen der Metadaten",
+ "title": "Debug",
+ "metadata_exec_title": "Pipeline lokal erneut ausführen",
+ "metadata_exec_desc": "Lade die Metadaten dieser Pipeline herunter, um diese lokal auszuführen. Dies erlaubt dir, Fehler zu beheben und Änderungen zu testen, bevor du einen Commit erstellst."
+ }
},
"pull_requests": "Pull-Requests",
"settings": {
@@ -389,7 +410,19 @@
},
"trusted": {
"desc": "Die zugrundeliegenden Pipeline-Container erhalten Zugriff auf ausgeweitete Funktionen (z. B. das Einhängen von Laufwerken).",
- "trusted": "Vertrauenswürdig"
+ "trusted": "Vertrauenswürdig",
+ "network": {
+ "network": "Netzwerk",
+ "desc": "Zugrundeliegende Pipeline-Container erhalten Zugriff auf Netzwerk-Privilegien wie das Ändern des DNS."
+ },
+ "volumes": {
+ "volumes": "Volumen",
+ "desc": "Zugrundeliegende Pipeline-Container erhalten Zugriff auf Volumen-Privilegien."
+ },
+ "security": {
+ "security": "Sicherheit",
+ "desc": "Zugrundeliegende Pipeline-Container erhalten Zugriff auf Sicherheits-Privilegien."
+ }
},
"visibility": {
"internal": {
@@ -537,6 +570,9 @@
},
"registries": {
"desc": "Register-Zugangsdaten des Benutzers können für private Images aller persönlichen Pipelines verwendet werden."
+ },
+ "agents": {
+ "desc": "Agenten, die für die Repositorys deines Benutzers registriert sind."
}
}
},
@@ -572,7 +608,11 @@
},
"plugins_only": "Nur für Plugins verfügbar",
"edit": "Geheimnis bearbeiten",
- "delete": "Geheimnis löschen"
+ "delete": "Geheimnis löschen",
+ "plugins": {
+ "images": "Nur für die folgenden Plugins verfügbar",
+ "desc": "Liste aller Plugin-Images, für die dieses Geheimnis verwendet werden kann. Freilassen, um alle Plugins und allgemeine Schritte zu erlauben."
+ }
},
"settings": "Einstellungen",
"oauth_error": "Fehler bei der Authentifizierung mit OAuth-Anbieter",
@@ -588,18 +628,18 @@
"credentials": "Register-Zugangsdaten",
"none": "Es gibt noch keine Register-Zugangsdaten.",
"registries": "Register",
- "desc": "Register-Zugangsdaten können für private Images in Pipelines verwendet werden.",
+ "desc": "Register-Zugangsdaten können hinzugefügt werden, um private Images für Pipelines zu nutzen.",
"deleted": "Register-Zugangsdaten gelöscht",
"save": "Register speichern",
"add": "Register hinzufügen",
- "view": "Register anzeigen",
+ "view": "Register ansehen",
"edit": "Register bearbeiten",
"delete": "Register löschen",
"created": "Register-Zugangsdaten erstellt",
"saved": "Register-Zugangsdaten gespeichert",
- "show": "Register anzeigen"
+ "show": "Zeige Register"
},
- "invalid_state": "Der OAuth-Status ist ungültig.",
+ "invalid_state": "Der OAuth-Status ist ungültig",
"by_user": "von {user}",
"pushed_to": "gepusht auf",
"closed": "geschlossen",
diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json
index 244771d10..194c6afcd 100644
--- a/web/src/assets/locales/en.json
+++ b/web/src/assets/locales/en.json
@@ -38,7 +38,8 @@
"desc": "Specify additional variables to use in your pipeline. Variables with the same name will be overwritten.",
"name": "Variable name",
"value": "Variable value"
- }
+ },
+ "show_pipelines": "Show pipelines"
},
"deploy_pipeline": {
"title": "Trigger deployment event for current pipeline #{pipelineId}",
@@ -97,7 +98,18 @@
},
"trusted": {
"trusted": "Trusted",
- "desc": "Underlying pipeline containers get access to escalated capabilities (like mounting volumes)."
+ "network": {
+ "network": "Network",
+ "desc": "Underlying pipeline containers get access to network privileges like changing DNS."
+ },
+ "volumes": {
+ "volumes": "Volumes",
+ "desc": "Underlying pipeline containers get access to volume privileges."
+ },
+ "security": {
+ "security": "Security",
+ "desc": "Underlying pipeline containers get access to security privileges."
+ }
},
"visibility": {
"visibility": "Project visibility",
@@ -191,6 +203,7 @@
"pipelines_for_pr": "Pipelines for pull request #{index}",
"exit_code": "Exit Code {exitCode}",
"loading": "Loading…",
+ "no_logs": "No logs",
"pipeline": "Pipeline #{pipelineId}",
"log_title": "Step Logs",
"log_download_error": "There was an error while downloading the log file",
@@ -244,7 +257,16 @@
"show_errors": "Show errors",
"we_got_some_errors": "Oh no, we got some errors!",
"duration": "Pipeline duration",
- "created": "Created: {created}"
+ "created": "Created: {created}",
+ "debug": {
+ "title": "Debug",
+ "download_metadata": "Download metadata",
+ "metadata_download_error": "Error downloading metadata",
+ "metadata_download_successful": "Metadata downloaded successfully",
+ "no_permission": "You don't have permission to access debug information.",
+ "metadata_exec_title": "Rerun pipeline locally",
+ "metadata_exec_desc": "Download this pipeline's metadata to run it locally. This allows you to troubleshoot issues and test changes before committing them."
+ }
}
},
"org": {
@@ -255,6 +277,9 @@
},
"registries": {
"desc": "Organization registry credentials can be added to use private images for all pipelines of an organization."
+ },
+ "agents": {
+ "desc": "Agents registered for this organization."
}
}
},
@@ -302,6 +327,13 @@
"desc": "The max amount of parallel pipelines executed by this agent.",
"badge": "capacity"
},
+ "custom_labels": {
+ "custom_labels": "Custom Labels",
+ "desc": "The custom labels set by the agent admin on agent startup."
+ },
+ "org": {
+ "badge": "org"
+ },
"version": "Version",
"last_contact": "Last contact",
"never": "Never",
@@ -404,6 +436,9 @@
"download_cli": "Download CLI",
"reset_token": "Reset token",
"swagger_ui": "Swagger UI"
+ },
+ "agents": {
+ "desc": "Agents registered to your account repos."
}
}
},
@@ -420,9 +455,9 @@
"deleted": "Secret deleted",
"created": "Secret created",
"saved": "Secret saved",
- "images": {
- "images": "Available for the following images",
- "desc": "List of images where this secret is available, leave empty to allow for all images."
+ "plugins": {
+ "images": "Available only for the following plugins",
+ "desc": "List of plugin images where this secret is available. Leave empty to allow for all plugins and normal steps."
},
"events": {
"events": "Available at the following events",
diff --git a/web/src/assets/locales/eo.json b/web/src/assets/locales/eo.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/web/src/assets/locales/eo.json
@@ -0,0 +1 @@
+{}
diff --git a/web/src/assets/locales/fr.json b/web/src/assets/locales/fr.json
index f62861cbf..43221f3dd 100644
--- a/web/src/assets/locales/fr.json
+++ b/web/src/assets/locales/fr.json
@@ -17,7 +17,7 @@
"delete_agent": "Supprimer l'agent",
"delete_confirm": "Voulez vous vraiment supprimer cet agent ? Il ne pourra plus se connecter sur le serveur.",
"deleted": "Agent supprimé",
- "desc": "Agents enregistrés sur ce serveur",
+ "desc": "Agents enregistrés sur ce serveur.",
"edit_agent": "Éditer l'agent",
"id": "ID",
"last_contact": "Dernier contact",
@@ -41,12 +41,12 @@
"token": "Jeton",
"version": "Version"
},
- "not_allowed": "Vous n'êtes pas autorisé à accéder aux réglages du serveur",
+ "not_allowed": "Vous n'êtes pas autorisé à accéder aux réglages du serveur.",
"orgs": {
"delete_confirm": "Voulez-vous vraiment supprimer cette organisation ? Cela supprimera tous les dépôts que possède cette organisation.",
"delete_org": "Supprimer l'organisation",
"deleted": "Organisation supprimée",
- "desc": "Organisations possédant des dépôts sur ce serveur",
+ "desc": "Organisations possédant des dépôts sur ce serveur.",
"none": "Il n'y a pas encore d'organisation.",
"org_settings": "Réglages de l'organisation",
"orgs": "Organisations",
@@ -74,7 +74,7 @@
"waiting_for": "en attente de"
},
"repos": {
- "desc": "Dépôts actifs ou anciennement actifs sur ce serveur",
+ "desc": "Dépôts actifs ou anciennement actifs sur ce serveur.",
"disabled": "Désactivé",
"none": "Il n'y a pas encore de dépôts.",
"repair": {
@@ -106,7 +106,7 @@
"secrets": "Secrets",
"show": "Afficher les secrets",
"value": "Valeur",
- "warning": "Ces secrets seront disponibles pour tout les comptes du serveur."
+ "warning": "Ces secrets seront disponibles pour tout les comptes."
},
"settings": "Réglages",
"users": {
@@ -132,8 +132,8 @@
"users": "Utilisateurs"
},
"registries": {
- "warning": "Ces codes d’accès au registre seront disponibles pour tout les utilisateurs du serveur.",
- "desc": "Les codes d'accès aux registres globaux peuvent être ajouter pour utiliser les images privées sur tout les pipelines du serveur."
+ "warning": "Ces codes d’accès au registre seront disponibles pour tout les utilisateurs.",
+ "desc": "Les codes d'accès aux registres globaux peuvent être ajouter pour utiliser les images privées sur tout les pipelines."
}
}
},
@@ -161,7 +161,7 @@
"add": "Ajouter un secret",
"created": "Secret d'organisation crée",
"deleted": "Secret d'organisation supprimé",
- "desc": "Les secrets d'organisation sont transmis sous forme de variable d’environnement lors de l’exécution de chaque étape d'un pipeline de tout les dépôts de l'organisation.",
+ "desc": "Les secrets d'organisation sont transmis sous forme de variable d’environnement à chaque étape d'un pipeline de tout les dépôts de l'organisation.",
"events": {
"events": "Disponible pour les événements suivants",
"pr_warning": "Faites attention avec cette option car un acteur malicieux pourrait soumettre une pull request qui va afficher vos secrets."
@@ -225,7 +225,8 @@
"title": "Variables de pipeline supplémentaire",
"value": "Valeur de la variable",
"delete": "Supprimer la variable"
- }
+ },
+ "show_pipelines": "Afficher les pieplines"
},
"not_allowed": "Vous n'êtes pas autorisé à accéder à ce dépôt",
"open_in_forge": "Ouvrir le dépôt dans la forge",
@@ -293,7 +294,15 @@
"warnings": "Avertissements ({count})",
"we_got_some_errors": "Oh non, il y a des erreurs !",
"log_delete_error": "Il y a eu une erreur lors de la suppression des logs",
- "log_delete_confirm": "Voulez vous vraiment supprimer les logs de cette étape ?"
+ "log_delete_confirm": "Voulez vous vraiment supprimer les logs de cette étape ?",
+ "no_logs": "Aucun logs",
+ "duration": "Durée du pipeline",
+ "created": "Crée : {created}",
+ "debug": {
+ "title": "Débogage",
+ "download_metadata": "Télécharger les métadonnées",
+ "metadata_download_error": "Erreur lors du téléchargement des métadonnées"
+ }
},
"pull_requests": "Pull requests",
"settings": {
@@ -385,7 +394,7 @@
"timeout": "Délai d’inactivité"
},
"trusted": {
- "desc": "Les conteneurs du pipeline ont accès à des capacités privilégiées comme le montage de volumes.",
+ "desc": "Les conteneurs du pipeline ont accès à des capacités privilégiées (comme le montage de volumes).",
"trusted": "Vérifié"
},
"visibility": {
@@ -503,7 +512,7 @@
"add": "Ajouter un secret",
"created": "Secret d'utilisateur crée",
"deleted": "Secret d'utilisateur supprimé",
- "desc": "Les secrets d'utilisateur peuvent être passés à toutes les étapes du pipeline des dépôts de l'utilisateur sous forme de variables d'environnement.",
+ "desc": "Les secrets d'utilisateur peuvent être passés à toutes les étapes d'un pipeline personnel sous forme de variables d'environnement.",
"events": {
"events": "Disponible pour les événements suivants",
"pr_warning": "Attention, si cette option est activée, un acteur malveillant peut proposer une pull request qui affiche vos secrets."
@@ -546,7 +555,7 @@
"login_to_cli_description": "En continuant, vous serez connecté via la ligne de commande.",
"secrets": {
"secrets": "Secrets",
- "desc": "Les secrets peuvent être transmis aux différentes étapes de la pipeline au moment de l'exécution en tant que variables d'environnement.",
+ "desc": "Les secrets peuvent être transmis aux différentes étapes de la pipeline en tant que variables d'environnement.",
"images": {
"desc": "Liste des images pour lesquelles ce secret est disponible, laisser vide pour autoriser toutes les images",
"images": "Disponible pour les images suivantes"
@@ -562,12 +571,15 @@
"saved": "Secret sauvegardé",
"events": {
"events": "Disponible lors des événements suivants",
- "pr_warning": "Soyez prudent avec cette option car un acteur malveillant peut soumettre une pull request qui expose vos secrets."
+ "pr_warning": "Soyez prudent avec cette option : un acteur malveillant peut soumettre une pull request qui expose vos secrets."
},
"plugins_only": "Uniquement disponible pour les plugins",
"edit": "Modifier le secret",
"delete": "Supprimer le secret",
- "delete_confirm": "Voulez vous vraiment supprimer ce secret ?"
+ "delete_confirm": "Voulez vous vraiment supprimer ce secret ?",
+ "plugins": {
+ "images": "Disponible pour les plugins suivants"
+ }
},
"internal_error": "Une erreur interne est survenue",
"access_denied": "Vous n'êtes pas autorisé à accéder à cette instance",
@@ -578,7 +590,7 @@
"registries": "Registres",
"delete_confirm": "Voulez vous vraiment supprimer ce registre ?",
"deleted": "Codes d'accès aux registres supprimés",
- "desc": "Les codes d'accès aux registres peuvent être ajouter pour utiliser des images privées sur votre pipeline.",
+ "desc": "Les codes d'accès aux registres peuvent être ajouté pour utiliser des images privées sur les pipelines.",
"credentials": "Codes d’accès aux registres",
"edit": "Éditer le registre",
"delete": "Supprimer le registre",
diff --git a/web/src/assets/locales/it.json b/web/src/assets/locales/it.json
index f1e6d6a85..3b4753946 100644
--- a/web/src/assets/locales/it.json
+++ b/web/src/assets/locales/it.json
@@ -29,7 +29,7 @@
"placeholder": "L'utente è un amministratore"
},
"created": "Utente creato",
- "delete_confirm": "Vuoi davvero eliminare questo utente? Ciò eliminerà anche tutti i repository di proprietà di questo utente.",
+ "delete_confirm": "Vuoi davvero eliminare questo utente? Ciò eliminerà anche tutte le repository di proprietà di questo utente.",
"delete_user": "Elimina utente",
"deleted": "Utente eliminato",
"edit_user": "Modifica utente",
@@ -82,7 +82,14 @@
"never": "Mai",
"delete_confirm": "Vuoi davvero eliminare questo agente? Non sarà più in grado di connettersi al server.",
"edit_agent": "Modifica agente",
- "delete_agent": "Elimina agente"
+ "delete_agent": "Elimina agente",
+ "org": {
+ "badge": "org"
+ },
+ "custom_labels": {
+ "custom_labels": "Etichette Personalizzate",
+ "desc": "Le etichette personalizzate impostate dall'amministratore dell'agente all'avvio dell'agente."
+ }
},
"orgs": {
"desc": "Organizzazioni che possiedono repository su questo server.",
@@ -90,24 +97,24 @@
"delete_org": "Elimina organizzazione",
"deleted": "Organizzazione eliminata",
"org_settings": "Impostazioni organizzazione",
- "delete_confirm": "Vuoi davvero eliminare questa organizzazione? Ciò eliminerà anche tutti i repository di proprietà di questa organizzazione.",
+ "delete_confirm": "Vuoi davvero eliminare questa organizzazione? Ciò eliminerà anche tutte le repository di proprietà di questa organizzazione.",
"view": "Mostra organizzazione",
"orgs": "Organizzazioni"
},
"secrets": {
"warning": "Questi segreti saranno disponibili a tutti gli utenti.",
- "desc": "I segreti globali possono essere passati ad ogni step della pipeline del repository, come variabili d'ambiente."
+ "desc": "I segreti globali possono essere passati ad ogni step della pipeline della repository, come variabili d'ambiente."
},
"repos": {
"settings": "Impostazioni repository",
"repos": "Repository",
- "desc": "Repository che sono o sono stati abilitati su questo server.",
- "none": "Ancora nessun repository.",
+ "desc": "Repository che sono o sono state abilitate su questo server.",
+ "none": "Ancora nessuna repository.",
"view": "Mostra repository",
"disabled": "Disabilitato",
"repair": {
"repair": "Ripara tutti",
- "success": "Repository riparati"
+ "success": "Repository riparate"
}
},
"not_allowed": "Non ti è consentito accedere alle impostazioni del server.",
@@ -155,7 +162,7 @@
"enabled": "Già abilitato",
"list_reloaded": "Elenco dei repository ricaricato",
"reload": "Ricarica i repository",
- "success": "Repository abilitato",
+ "success": "Repository abilitata",
"disabled": "Disabilitato"
},
"manual_pipeline": {
@@ -169,10 +176,11 @@
"title": "Variabili aggiuntive per la pipeline",
"value": "Valore variabile",
"delete": "Elimina variabile"
- }
+ },
+ "show_pipelines": "Mostra pipeline"
},
- "not_allowed": "Non ti è consentito accedere a questo repository",
- "open_in_forge": "Apri pagina web del repository",
+ "not_allowed": "Non ti è consentito accedere a questa repository",
+ "open_in_forge": "Apri pagina web della repository",
"pipeline": {
"actions": {
"cancel": "Annulla",
@@ -237,28 +245,38 @@
"log_title": "Registro Attività di Step",
"pipelines_for_pr": "Pipeline per richiesta di modifica #{index}",
"duration": "Durata pipeline",
- "created": "Creata: {created}"
+ "created": "Creata: {created}",
+ "no_logs": "Nessun registro",
+ "debug": {
+ "title": "Diagnostica",
+ "download_metadata": "Download metadati",
+ "metadata_download_error": "Errore durante il download dei metadati",
+ "metadata_download_successful": "Metadati scaricati correttamente",
+ "no_permission": "Non si dispone dell'autorizzazione per accedere alle informazioni di diagnostica.",
+ "metadata_exec_title": "Riesegui pipeline localmente",
+ "metadata_exec_desc": "Scarica i metadati di questa pipeline per eseguirla in locale. In questo modo è possibile risolvere i problemi e testare le modifiche prima di eseguirne il commit."
+ }
},
"pull_requests": "Richieste di modifica",
"settings": {
"actions": {
"actions": "Azioni",
"repair": {
- "success": "Repository riparato",
+ "success": "Repository riparata",
"repair": "Ripara repository"
},
"delete": {
"delete": "Elimina repository",
"confirm": "Tutti i dati andranno persi dopo questa azione!!!\n\nVuoi davvero procedere?",
- "success": "Repository eliminato"
+ "success": "Repository eliminata"
},
"disable": {
"disable": "Disabilita repository",
- "success": "Repository disabilitato"
+ "success": "Repository disabilitata"
},
"enable": {
"enable": "Abilita repository",
- "success": "Repository abiltato"
+ "success": "Repository abiltata"
}
},
"crons": {
@@ -303,7 +321,7 @@
"desc": "Ogni pipeline deve essere approvata prima di essere eseguita."
},
"save": "Salva impostazioni",
- "success": "Impostazioni del repository aggiornate",
+ "success": "Impostazioni della repository aggiornate",
"timeout": {
"minutes": "minuti",
"timeout": "Scadenza"
@@ -314,7 +332,7 @@
"internal": "Interno"
},
"private": {
- "desc": "Solo tu e gli altri proprietari del repository potete vedere questo progetto.",
+ "desc": "Solo tu e gli altri proprietari della repository potete vedere questo progetto.",
"private": "Privato"
},
"public": {
@@ -344,7 +362,7 @@
"desc": "Inietta le credenziali netrc solo nei contenitori attendibili (consigliato)."
}
},
- "not_allowed": "Non ti è consentito accedere alle impostazioni di questo repository",
+ "not_allowed": "Non ti è consentito accedere alle impostazioni di questa repository",
"secrets": {
"name": "Nome",
"value": "Valore"
@@ -419,6 +437,9 @@
},
"registries": {
"desc": "È possibile aggiungere le credenziali di registro per utilizzare immagini private in tutte le pipeline personali."
+ },
+ "agents": {
+ "desc": "Agenti registrati nei repository dell'account."
}
}
},
@@ -446,7 +467,11 @@
"desc": "Elenco di immagini in cui questo segreto è disponibile, lascia vuoto per consentire a tutte le immagini."
},
"secrets": "Segreti",
- "desc": "I segreti possono essere passati ad ogni step della pipeline, come variabili d'ambiente."
+ "desc": "I segreti possono essere passati ad ogni step della pipeline, come variabili d'ambiente.",
+ "plugins": {
+ "images": "Disponibile solo per le seguenti estensioni",
+ "desc": "Elenco delle estensioni in cui questo segreto è disponibile. Vuoto, per consentire a ogni estensione e step normale."
+ }
},
"default": "predefinito",
"info": "Dettagli",
@@ -472,10 +497,13 @@
"settings": {
"not_allowed": "Non ti è consentito accedere alle impostazioni di questa organizzazione",
"secrets": {
- "desc": "I segreti dell'organizzazione possono essere passati ad ogni step della pipeline del repository dell'organizzazione, come variabili d'ambiente."
+ "desc": "I segreti dell'organizzazione possono essere passati ad ogni step della pipeline della repository dell'organizzazione, come variabili d'ambiente."
},
"registries": {
"desc": "È possibile aggiungere le credenziali di registro dell'organizzazione per utilizzare immagini private per tutte le pipeline di un'organizzazione."
+ },
+ "agents": {
+ "desc": "Agenti registrati per questa organizzazione."
}
}
},
diff --git a/web/src/assets/locales/lv.json b/web/src/assets/locales/lv.json
index f21332615..33ebc777e 100644
--- a/web/src/assets/locales/lv.json
+++ b/web/src/assets/locales/lv.json
@@ -1,508 +1,605 @@
{
- "admin": {
- "settings": {
- "agents": {
- "add": "Pievienot aģentu",
- "agents": "Aģenti",
- "backend": {
- "backend": "Aizmugures sistēma",
- "badge": "aizmugures sistēma"
- },
- "capacity": {
- "badge": "paralēlie darbi",
- "capacity": "Paralēlie darbi",
- "desc": "Maksimālais aģenta paralēli izpildāmo konvejerdarbu skaits."
- },
- "created": "Aģents izveidots",
- "delete_agent": "Dzēst aģentu",
- "delete_confirm": "Vai patiešām dzēst šo aģentu? Tam vairs nebūs iespējas savienoties ar serveri.",
- "deleted": "Aģents izdzēsts",
- "desc": "Šajā serverī reģistrētie aģenti",
- "edit_agent": "Labot aģentu",
- "id": "ID",
- "last_contact": "Pēdējā sazināšanās",
- "name": {
- "name": "Nosaukums",
- "placeholder": "Aģenta nosaukums"
- },
- "never": "nekad",
- "no_schedule": {
- "name": "Atspējot aģentu",
- "placeholder": "Apturēt aģentu no jaunu darbu pieņemšanas"
- },
- "none": "Pagaidām nav neviena aģenta.",
- "platform": {
- "badge": "platforma",
- "platform": "Platforma"
- },
- "save": "Saglabāt aģentu",
- "saved": "Aģents saglabāts",
- "show": "Parādīt aģentus",
- "token": "Drošības talons",
- "version": "Versija"
- },
- "not_allowed": "Nav piekļuves servera iestatījumiem",
- "orgs": {
- "delete_confirm": "Vai patiešām vēlaties dzēst šo organizāciju? Tiks dzēsti arī visi organizācijai piederošie repozitoriji.",
- "delete_org": "Dzēst organizāciju",
- "deleted": "Organizācija tika izdzēsta",
- "desc": "Organizācijas, kurām pieder repozitoriji šajā serverī",
- "none": "Pagaidām nav nevienas organizācijas.",
- "org_settings": "Organizācijas iestatījumi",
- "orgs": "Organizācijas",
- "view": "Skatīt organizāciju"
- },
- "queue": {
- "agent": "aģents",
- "desc": "Uzdevumi, kuri gaida izpildi",
- "pause": "Apturēt",
- "paused": "Rinda ir apturēta",
- "queue": "Rinda",
- "resume": "Atsākt",
- "resumed": "Rindas apstrāde atsākta",
- "stats": {
- "completed_count": "Pabeigtie uzdevumi",
- "pending_count": "Gaida",
- "running_count": "Izpildās",
- "waiting_on_deps_count": "Gaida uz atkarībām",
- "worker_count": "Brīvi"
- },
- "task_pending": "Uzdevums gaida izpildi",
- "task_running": "Uzdevums tiek izpildīts",
- "task_waiting_on_deps": "Uzdevums gaida uz atkarībām",
- "tasks": "Uzdevumi",
- "waiting_for": "gaida uz"
- },
- "repos": {
- "desc": "Repozitoriji, kas ir vai ir bijuši iespējoti šajā serverī",
- "disabled": "Atspējots",
- "none": "Pagaidām nav neviena repozitorija.",
- "repair": {
- "repair": "Salabot visus",
- "success": "Repozitoriji salaboti"
- },
- "repos": "Repozitoriji",
- "settings": "Repozitorija iestatījumi",
- "view": "Skatīt repozitoriju"
- },
- "secrets": {
- "add": "Pievienot noslēpumu",
- "created": "Globālais noslēpums izveidots",
- "deleted": "Globālais noslēpums dzēsts",
- "desc": "Noslēpumus var padot visu repozitoriju individuāliem konvejerdarba soļiem izpildes laikā kā vides mainīgos.",
- "events": {
- "events": "Pieejams šādiem notikumiem",
- "pr_warning": "Uzmanieties, jo šādā veidā tas būs pieejams visiem cilvēkiem, kas var iesūtīt izmaiņu pieprasījumu."
- },
- "images": {
- "desc": "Ar komatiem atdalīts saraksts ar attēliem, kam šis noslēpums būs pieejams, atstājot tukšu, tas būs pieejams visiem attēliem",
- "images": "Pieejami šādiem attēliem"
- },
- "name": "Nosaukums",
- "none": "Pagaidām nav neviena globālā noslēpuma.",
- "plugins_only": "Pieejams tikai spraudņiem",
- "save": "Saglabāt noslēpumu",
- "saved": "Globālais noslēpums saglabāts",
- "secrets": "Noslēpumi",
- "show": "Noslēpumu saraksts",
- "value": "Vērtība",
- "warning": "Šie noslēpumi būs pieejami visiem servera lietotājiem."
- },
- "settings": "Iestatījumi",
- "users": {
- "add": "Pievienot lietotāju",
- "admin": {
- "admin": "Administrators",
- "placeholder": "Lietotājs ir administrators"
- },
- "avatar_url": "Avatāra URL",
- "cancel": "Atcelt",
- "created": "Lietotājs izveidots",
- "delete_confirm": "Vai patiešām vēlaties dzēst šo lietotāju? Tiks dzēsti arī visi lietotājam piederošie repozitoriji.",
- "delete_user": "Dzēst lietotāju",
- "deleted": "Lietotājs izdzēsts",
- "desc": "Lietotāji, kas ir reģistrēti šajā serverī",
- "edit_user": "Labot lietotāju",
- "email": "E-pasta adrese",
- "login": "Lietotāja vārds",
- "none": "Pašlaik vēl nav neviena lietotāja.",
- "save": "Saglabāt lietotāju",
- "saved": "Lietotāja dati saglabāti",
- "show": "Parādīt lietotājus",
- "users": "Lietotāji"
- }
- }
- },
- "api": "API",
- "back": "Atpakaļ",
- "cancel": "Atcelt",
- "default": "noklusētais",
- "docs": "Dokumentācija",
- "documentation_for": "Dokumentācija par \"{topic}\"",
- "errors": {
- "not_found": "Nevarēja atrast pieprasīto objektu"
- },
- "info": "Informācija",
- "login": "Autorizēties",
- "logout": "Iziet",
- "not_found": {
- "back_home": "Uz sākumu",
- "not_found": "Ak vai, 404, vai nu mēs salauzām kaut ko, vai arī tika atvērta lapa, kas neeksistē :-/"
- },
- "org": {
- "settings": {
- "not_allowed": "Nav piekļuves šīs organizācijas iestatījumiem",
- "secrets": {
- "add": "Pievienot noslēpumu",
- "created": "Organizācijas noslēpums izveidots",
- "deleted": "Organizācijas noslēpums dzēsts",
- "desc": "Noslēpumus var padot visu organizācijas repozitoriju individuāliem konvejerdarba soļiem izpildes laikā kā vides mainīgos.",
- "events": {
- "events": "Pieejams šādiem notikumiem",
- "pr_warning": "Uzmanieties, jo šādā veidā tas būs pieejams visiem cilvēkiem, kas var iesūtīt izmaiņu pieprasījumu."
- },
- "images": {
- "desc": "Ar komatiem atdalīts saraksts ar attēliem, kam šis noslēpums būs pieejams, atstājot tukšu, tas būs pieejams visiem attēliem",
- "images": "Pieejami šādiem attēliem"
- },
- "name": "Nosaukums",
- "none": "Pagaidām nav neviena organizācijas noslēpuma.",
- "plugins_only": "Pieejams tikai spraudņiem",
- "save": "Saglabāt noslēpumu",
- "saved": "Organizācijas noslēpums saglabāts",
- "secrets": "Noslēpumi",
- "show": "Noslēpumu saraksts",
- "value": "Vērtība"
- },
- "settings": "Iestatījumi"
- }
- },
- "password": "Parole",
- "pipeline_feed": "Konvejerdarba padeve",
- "repo": {
- "activity": "Aktivitāte",
- "add": "Pievienot repozitoriju",
- "branches": "Atzari",
- "deploy_pipeline": {
- "enter_target": "Mērķa uzstādīšanas vide",
- "title": "Iniciēt uzstādīšanas notikumu šim konvejerdarbam #{pipelineId}",
- "trigger": "Uzstādīt",
- "variables": {
- "add": "Pievienot mainīgo",
- "desc": "Norādiet papildus mainīgos, ko izmantot konvejerdarbā. Mainīgie ar šādu pašu nosaukumu tiks pārrakstīti.",
- "name": "Mainīgā nosaukums",
- "title": "Papildus konvejerdarba mainīgie",
- "value": "Mainīgā vērtība"
- }
+ "admin": {
+ "settings": {
+ "agents": {
+ "add": "Pievienot aģentu",
+ "agents": "Aģenti",
+ "backend": {
+ "backend": "Aizmugures sistēma",
+ "badge": "aizmugures sistēma"
+ },
+ "capacity": {
+ "badge": "paralēlie darbi",
+ "capacity": "Paralēlie darbi",
+ "desc": "Maksimālais aģenta paralēli izpildāmo konvejerdarbu skaits."
+ },
+ "created": "Aģents izveidots",
+ "delete_agent": "Dzēst aģentu",
+ "delete_confirm": "Vai tiešām vēlaties dzēst šo aģentu? Tam vairs nebūs iespējas savienoties ar serveri.",
+ "deleted": "Aģents izdzēsts",
+ "desc": "Šajā serverī reģistrētie aģenti.",
+ "edit_agent": "Labot aģentu",
+ "id": "ID",
+ "last_contact": "Pēdējā sazināšanās",
+ "name": {
+ "name": "Nosaukums",
+ "placeholder": "Aģenta nosaukums"
+ },
+ "never": "nekad",
+ "no_schedule": {
+ "name": "Atspējot aģentu",
+ "placeholder": "Apturēt aģentu no jaunu darbu pieņemšanas"
+ },
+ "none": "Pagaidām nav neviena aģenta.",
+ "platform": {
+ "badge": "platforma",
+ "platform": "Platforma"
+ },
+ "save": "Saglabāt aģentu",
+ "saved": "Aģents saglabāts",
+ "show": "Parādīt aģentus",
+ "token": "Drošības talons",
+ "version": "Versija"
+ },
+ "not_allowed": "Nav piekļuves servera iestatījumiem.",
+ "orgs": {
+ "delete_confirm": "Vai patiešām vēlaties dzēst šo organizāciju? Tiks dzēsti arī visi organizācijai piederošie repozitoriji.",
+ "delete_org": "Dzēst organizāciju",
+ "deleted": "Organizācija tika izdzēsta",
+ "desc": "Organizācijas, kurām pieder repozitoriji šajā serverī.",
+ "none": "Pagaidām nav nevienas organizācijas.",
+ "org_settings": "Organizācijas iestatījumi",
+ "orgs": "Organizācijas",
+ "view": "Skatīt organizāciju"
+ },
+ "queue": {
+ "agent": "aģents",
+ "desc": "Uzdevumi, kuri gaida izpildi",
+ "pause": "Apturēt",
+ "paused": "Rinda ir apturēta",
+ "queue": "Rinda",
+ "resume": "Atsākt",
+ "resumed": "Rindas apstrāde atsākta",
+ "stats": {
+ "completed_count": "Pabeigtie uzdevumi",
+ "pending_count": "Gaida",
+ "running_count": "Izpildās",
+ "waiting_on_deps_count": "Gaida uz atkarībām",
+ "worker_count": "Brīvi"
+ },
+ "task_pending": "Uzdevums gaida izpildi",
+ "task_running": "Uzdevums tiek izpildīts",
+ "task_waiting_on_deps": "Uzdevums gaida uz atkarībām",
+ "tasks": "Uzdevumi",
+ "waiting_for": "gaida uz"
+ },
+ "repos": {
+ "desc": "Repozitoriji, kas ir vai ir bijuši iespējoti šajā serverī.",
+ "disabled": "Atspējots",
+ "none": "Pagaidām nav neviena repozitorija.",
+ "repair": {
+ "repair": "Salabot visus",
+ "success": "Repozitoriji salaboti"
+ },
+ "repos": "Repozitoriji",
+ "settings": "Repozitorija iestatījumi",
+ "view": "Skatīt repozitoriju"
+ },
+ "secrets": {
+ "add": "Pievienot noslēpumu",
+ "created": "Globālais noslēpums izveidots",
+ "deleted": "Globālais noslēpums dzēsts",
+ "desc": "Noslēpumus var padot visu repozitoriju konvejerdarba soļiem izpildes laikā kā vides mainīgos.",
+ "events": {
+ "events": "Pieejams šādiem notikumiem",
+ "pr_warning": "Uzmanieties, jo šādā veidā tas būs pieejams visiem cilvēkiem, kas var iesūtīt izmaiņu pieprasījumu."
+ },
+ "images": {
+ "desc": "Ar komatiem atdalīts saraksts ar attēliem, kam šis noslēpums būs pieejams, atstājot tukšu, tas būs pieejams visiem attēliem",
+ "images": "Pieejami šādiem attēliem"
+ },
+ "name": "Nosaukums",
+ "none": "Pagaidām nav neviena globālā noslēpuma.",
+ "plugins_only": "Pieejams tikai spraudņiem",
+ "save": "Saglabāt noslēpumu",
+ "saved": "Globālais noslēpums saglabāts",
+ "secrets": "Noslēpumi",
+ "show": "Noslēpumu saraksts",
+ "value": "Vērtība",
+ "warning": "Šie noslēpumi būs pieejami visiem lietotājiem."
+ },
+ "settings": "Iestatījumi",
+ "users": {
+ "add": "Pievienot lietotāju",
+ "admin": {
+ "admin": "Administrators",
+ "placeholder": "Lietotājs ir administrators"
+ },
+ "avatar_url": "Avatāra URL",
+ "cancel": "Atcelt",
+ "created": "Lietotājs izveidots",
+ "delete_confirm": "Vai patiešām vēlaties dzēst šo lietotāju? Tiks dzēsti arī visi lietotājam piederošie repozitoriji.",
+ "delete_user": "Dzēst lietotāju",
+ "deleted": "Lietotājs izdzēsts",
+ "desc": "Lietotāji, kas ir reģistrēti šajā serverī",
+ "edit_user": "Labot lietotāju",
+ "email": "E-pasta adrese",
+ "login": "Lietotāja vārds",
+ "none": "Pašlaik vēl nav neviena lietotāja.",
+ "save": "Saglabāt lietotāju",
+ "saved": "Lietotāja dati saglabāti",
+ "show": "Parādīt lietotājus",
+ "users": "Lietotāji"
+ },
+ "registries": {
+ "warning": "Šie repozitorijas pilnvaras būs pieejamas visiem lietotājiem.",
+ "desc": "Globāli repozitoriju pilnvaras var tikt pievienoti pielietošanai privātos attēlos visiem konvejerdarbiem."
+ }
+ }
},
- "enable": {
- "disabled": "Atspējots",
- "enable": "Iespējot",
- "enabled": "Jau ir iespējots",
- "list_reloaded": "Repozitoriju sarakts tika pārlādēts",
- "reload": "Pārlādēt repozitorijus",
- "success": "Repozitorijs iespējots"
+ "api": "API",
+ "back": "Atpakaļ",
+ "cancel": "Atcelt",
+ "default": "noklusētais",
+ "docs": "Dokumentācija",
+ "documentation_for": "Dokumentācija par \"{topic}\"",
+ "errors": {
+ "not_found": "Nevarēja atrast pieprasīto objektu"
},
- "manual_pipeline": {
- "select_branch": "Norādiet atzaru",
- "title": "Iniciēt manuālu konvejerdarba izpildi",
- "trigger": "Izpildīt konvejerdarbu",
- "variables": {
- "add": "Pievienot",
- "desc": "Norādiet papildus mainīgos, ko izmantot konvejerdarbā. Mainīgie ar tādu pašu nosaukumu tiks pārrakstīti.",
- "name": "Mainīgā nosaukums",
- "title": "Papildus konvejerdarba mainīgie",
- "value": "Mainīgā vērtība"
- }
+ "info": "Informācija",
+ "login": "Autorizēties",
+ "logout": "Iziet",
+ "not_found": {
+ "back_home": "Uz sākumu",
+ "not_found": "Ak vai, 404, vai nu mēs salauzām kaut ko, vai arī tika atvērta lapa, kas neeksistē :-/"
},
- "not_allowed": "Nav piekļuves šim repozitorijam",
- "open_in_forge": "Atvērt repozitoriju versijas kontroles sistēmā",
- "pipeline": {
- "actions": {
- "cancel": "Atcelt",
- "cancel_success": "Konvejerdarbs atcelts",
- "canceled": "Šis solis tika atcelts.",
- "deploy": "Uzstādīt",
- "log_auto_scroll": "Automātiski ritināt",
- "log_auto_scroll_off": "Atslēgt automātisko ritināšanu",
- "log_download": "Lejupielādēt",
- "restart": "Pārstartēt",
- "restart_success": "Konvejerdarbs pārstartēts"
- },
- "config": "Konfigurācija",
- "errors": "Kļūdas ({count})",
- "event": {
- "cron": "Plānotais darbs",
- "deploy": "Uzstādīšana",
- "manual": "Manuāls",
- "pr": "Izmaiņu pieprasījums",
- "push": "Iesūtīšana",
- "tag": "Tags"
- },
- "exit_code": "Iziešanas kods {exitCode}",
- "files": "Izmainītie faili ({files})",
- "loading": "Notiek ielāde…",
- "log_download_error": "Veicot žurnālfaila lejupielādi notika kļūda",
- "log_title": "Soļa žurnāls",
- "no_files": "Neviens fails nav mainīts.",
- "no_pipeline_steps": "Konvejerdarbam nav neviena soļa!",
- "no_pipelines": "Neviens konvejerdarbs vēl nav uzsākts.",
- "pipeline": "Konvejerdarbs #{pipelineId}",
- "pipelines_for": "Konvejerdarbi atzaram \"{branch}\"",
- "pipelines_for_pr": "Konvejerdarbi izmaiņu pieprasījumam #{index}",
- "protected": {
- "approve": "Apstiprināt",
- "approve_success": "Konvejerdarbs apstiprināts",
- "awaits": "Šim konvejerdarbam ir nepieciešams apstiprinājums no atbildīgajām personām!",
- "decline": "Noraidīt",
- "decline_success": "Konvejerdarbs noraidīts",
- "declined": "Šis konvejerdarbs tika noraidīts!",
- "review": "Pārskatiet izmaiņas"
- },
- "show_errors": "Rādīt kļūdas",
- "status": {
- "blocked": "bloķēts",
- "declined": "noraidīts",
- "error": "kļūda",
- "failure": "neveiksmīgs",
- "killed": "apturēts",
- "pending": "gaida izpildi",
- "running": "izpildās",
- "skipped": "izlaists",
- "started": "uzsākts",
- "status": "Statuss: {status}",
- "success": "izpildīts"
- },
- "step_not_started": "Šis solis vēl nav uzsākts.",
- "tasks": "Uzdevumi",
- "warnings": "Brīdinājumi ({count})",
- "we_got_some_errors": "Ak nē, notika kļūda!"
+ "org": {
+ "settings": {
+ "not_allowed": "Nav piekļuves šīs organizācijas iestatījumiem",
+ "secrets": {
+ "add": "Pievienot noslēpumu",
+ "created": "Organizācijas noslēpums izveidots",
+ "deleted": "Organizācijas noslēpums dzēsts",
+ "desc": "Noslēpumus var padot visu organizācijas repozitoriju konvejerdarba soļiem kā vides mainīgos.",
+ "events": {
+ "events": "Pieejams šādiem notikumiem",
+ "pr_warning": "Uzmanieties, jo šādā veidā tas būs pieejams visiem cilvēkiem, kas var iesūtīt izmaiņu pieprasījumu."
+ },
+ "images": {
+ "desc": "Ar komatiem atdalīts saraksts ar attēliem, kam šis noslēpums būs pieejams, atstājot tukšu, tas būs pieejams visiem attēliem",
+ "images": "Pieejami šādiem attēliem"
+ },
+ "name": "Nosaukums",
+ "none": "Pagaidām nav neviena organizācijas noslēpuma.",
+ "plugins_only": "Pieejams tikai spraudņiem",
+ "save": "Saglabāt noslēpumu",
+ "saved": "Organizācijas noslēpums saglabāts",
+ "secrets": "Noslēpumi",
+ "show": "Noslēpumu saraksts",
+ "value": "Vērtība"
+ },
+ "settings": "Iestatījumi",
+ "registries": {
+ "desc": "Organizācijas reģistrijas pilnvaras var tikt pievienoti, lai izmantotu privātas attēlos priekš visiem konvejerdarbiem organizācijā."
+ }
+ }
},
- "pull_requests": "Izmaiņu pieprasījumi",
- "settings": {
- "actions": {
- "actions": "Darbības",
- "delete": {
- "confirm": "Visi repozitorija dati tiks neatgriezeniski dzēsti!\n\nVai vēlaties turpināt?",
- "delete": "Dzēst repozitoriju",
- "success": "Repozitorijs dzēsts"
- },
- "disable": {
- "disable": "Atspējot repozitoriju",
- "success": "Repozitorijs atspējots"
+ "password": "Parole",
+ "pipeline_feed": "Konvejerdarba padeve",
+ "repo": {
+ "activity": "Aktivitāte",
+ "add": "Pievienot repozitoriju",
+ "branches": "Atzari",
+ "deploy_pipeline": {
+ "enter_target": "Mērķa uzstādīšanas vide",
+ "title": "Iniciēt uzstādīšanas notikumu šim konvejerdarbam #{pipelineId}",
+ "trigger": "Uzstādīt",
+ "variables": {
+ "add": "Pievienot mainīgo",
+ "desc": "Norādiet papildus mainīgos, ko izmantot konvejerdarbā. Mainīgie ar šādu pašu nosaukumu tiks pārrakstīti.",
+ "name": "Mainīgā nosaukums",
+ "title": "Papildus konvejerdarba mainīgie",
+ "value": "Mainīgā vērtība",
+ "delete": "Dzēst mainīgo"
+ },
+ "enter_task": "Uzstādīšanas uzdevums"
},
"enable": {
- "enable": "Iespējot repozitoriju",
- "success": "Repozitorijs iespējots"
+ "disabled": "Atspējots",
+ "enable": "Iespējot",
+ "enabled": "Jau ir iespējots",
+ "list_reloaded": "Repozitoriju sarakts tika pārlādēts",
+ "reload": "Pārlādēt repozitorijus",
+ "success": "Repozitorijs iespējots"
},
- "repair": {
- "repair": "Salabot repozitoriju",
- "success": "Repozitorijs salabots"
- }
- },
- "badge": {
- "badge": "Nozīmīte",
- "branch": "Atzars",
- "type": "Pieraksta veids",
- "type_html": "HTML",
- "type_markdown": "Markdown",
- "type_url": "URL"
- },
- "crons": {
- "add": "Pievienot plānoto darbu",
- "branch": {
- "placeholder": "Atzars (atstājiet tukšu, lai izmantotu noklusēto atzaru)",
- "title": "Atzars"
+ "manual_pipeline": {
+ "select_branch": "Norādiet atzaru",
+ "title": "Iniciēt manuālu konvejerdarba izpildi",
+ "trigger": "Izpildīt konvejerdarbu",
+ "variables": {
+ "add": "Pievienot",
+ "desc": "Norādiet papildus mainīgos, ko izmantot konvejerdarbā. Mainīgie ar tādu pašu nosaukumu tiks pārrakstīti.",
+ "name": "Mainīgā nosaukums",
+ "title": "Papildus konvejerdarba mainīgie",
+ "value": "Mainīgā vērtība",
+ "delete": "Dzēst mainīgo"
+ },
+ "show_pipelines": "Rādīt konvejerdarbus"
},
- "created": "Izveidots plānotais darbs",
- "crons": "Darbu plānotājs",
- "delete": "Dzēst darbu plānotāju",
- "deleted": "Plānotais darbs izdzēsts",
- "desc": "Darbu plānotājs var tikt izmantots, lai izpildītu konvejerdarbus pēc noteikta grafika.",
- "edit": "Labot darbu plānotāju",
- "name": {
- "name": "Nosaukums",
- "placeholder": "Plānotā darba nosaukums"
+ "not_allowed": "Nav piekļuves šim repozitorijam",
+ "open_in_forge": "Atvērt repozitoriju iekš forge",
+ "pipeline": {
+ "actions": {
+ "cancel": "Atcelt",
+ "cancel_success": "Konvejerdarbs atcelts",
+ "canceled": "Šis solis tika atcelts.",
+ "deploy": "Uzstādīt",
+ "log_auto_scroll": "Automātiski ritināt",
+ "log_auto_scroll_off": "Atslēgt automātisko ritināšanu",
+ "log_download": "Lejupielādēt",
+ "restart": "Pārstartēt",
+ "restart_success": "Konvejerdarbs pārstartēts",
+ "log_delete": "Dzēst"
+ },
+ "config": "Konfigurācija",
+ "errors": "Kļūdas ({count})",
+ "event": {
+ "cron": "Plānotais darbs",
+ "deploy": "Uzstādīšana",
+ "manual": "Manuāls",
+ "pr": "Izmaiņu pieprasījums",
+ "push": "Iesūtīšana",
+ "tag": "Tags",
+ "pr_closed": "Izmaiņu pieprasījums apvienots / aizvērts",
+ "release": "Relīze"
+ },
+ "exit_code": "Iziešanas kods {exitCode}",
+ "files": "Izmainītie faili ({files})",
+ "loading": "Notiek ielāde…",
+ "log_download_error": "Veicot žurnālfaila lejupielādi notika kļūda",
+ "log_title": "Soļa žurnāls",
+ "no_files": "Neviens fails nav mainīts.",
+ "no_pipeline_steps": "Konvejerdarbam nav neviena soļa!",
+ "no_pipelines": "Neviens konvejerdarbs vēl nav uzsākts.",
+ "pipeline": "Konvejerdarbs #{pipelineId}",
+ "pipelines_for": "Konvejerdarbi atzaram \"{branch}\"",
+ "pipelines_for_pr": "Konvejerdarbi izmaiņu pieprasījumam #{index}",
+ "protected": {
+ "approve": "Apstiprināt",
+ "approve_success": "Konvejerdarbs apstiprināts",
+ "awaits": "Šim konvejerdarbam ir nepieciešams apstiprinājums no atbildīgajām personām!",
+ "decline": "Noraidīt",
+ "decline_success": "Konvejerdarbs noraidīts",
+ "declined": "Šis konvejerdarbs tika noraidīts!",
+ "review": "Pārskatiet izmaiņas"
+ },
+ "show_errors": "Rādīt kļūdas",
+ "status": {
+ "blocked": "bloķēts",
+ "declined": "noraidīts",
+ "error": "kļūda",
+ "failure": "neveiksmīgs",
+ "killed": "apturēts",
+ "pending": "gaida izpildi",
+ "running": "izpildās",
+ "skipped": "izlaists",
+ "started": "uzsākts",
+ "status": "Statuss: {status}",
+ "success": "izpildīts"
+ },
+ "step_not_started": "Šis solis vēl nav uzsākts.",
+ "tasks": "Uzdevumi",
+ "warnings": "Brīdinājumi ({count})",
+ "we_got_some_errors": "Ak nē, notika kļūda!",
+ "no_logs": "Nav darbību žurnālu",
+ "duration": "Konvejerdarba ilgums",
+ "created": "Izveidots: {created}",
+ "log_delete_confirm": "Vai tiešām vēlaties dzēst šī soļa darbību žurnālus?",
+ "log_delete_error": "Notika kļūda dzēšot šī soļa darbību žurnālus"
},
- "next_exec": "Nākošā izpilde",
- "none": "Nav pievienots neviens plānotais darbs.",
- "not_executed_yet": "Vēl ne reizi nav izpildīts",
- "run": "Izpildīt tagad",
- "save": "Saglabāt plānoto darbu",
- "saved": "Plānotā darba izmaiņas saglabātas",
- "schedule": {
- "placeholder": "Grafiks",
- "title": "Grafiks (balstīts uz UTC laika joslu)"
+ "pull_requests": "Izmaiņu pieprasījumi",
+ "settings": {
+ "actions": {
+ "actions": "Darbības",
+ "delete": {
+ "confirm": "Visi repozitorija dati tiks neatgriezeniski dzēsti!\n\nVai vēlaties turpināt?",
+ "delete": "Dzēst repozitoriju",
+ "success": "Repozitorijs dzēsts"
+ },
+ "disable": {
+ "disable": "Atspējot repozitoriju",
+ "success": "Repozitorijs atspējots"
+ },
+ "enable": {
+ "enable": "Iespējot repozitoriju",
+ "success": "Repozitorijs iespējots"
+ },
+ "repair": {
+ "repair": "Salabot repozitoriju",
+ "success": "Repozitorijs salabots"
+ }
+ },
+ "badge": {
+ "badge": "Nozīmīte",
+ "branch": "Atzars",
+ "type": "Pieraksta veids",
+ "type_html": "HTML",
+ "type_markdown": "Markdown",
+ "type_url": "URL"
+ },
+ "crons": {
+ "add": "Pievienot plānoto darbu",
+ "branch": {
+ "placeholder": "Atzars (atstājiet tukšu, lai izmantotu noklusēto atzaru)",
+ "title": "Atzars"
+ },
+ "created": "Izveidots plānotais darbs",
+ "crons": "Darbu plānotājs",
+ "delete": "Dzēst darbu plānotāju",
+ "deleted": "Plānotais darbs izdzēsts",
+ "desc": "Darbu plānotājs var tikt izmantots, lai izpildītu konvejerdarbus pēc noteikta grafika.",
+ "edit": "Labot darbu plānotāju",
+ "name": {
+ "name": "Nosaukums",
+ "placeholder": "Plānotā darba nosaukums"
+ },
+ "next_exec": "Nākošā izpilde",
+ "none": "Nav pievienots neviens plānotais darbs.",
+ "not_executed_yet": "Vēl ne reizi nav izpildīts",
+ "run": "Izpildīt tagad",
+ "save": "Saglabāt plānoto darbu",
+ "saved": "Plānotā darba izmaiņas saglabātas",
+ "schedule": {
+ "placeholder": "Grafiks",
+ "title": "Grafiks (balstīts uz UTC laika joslu)"
+ },
+ "show": "Parādīt plānotos darbus"
+ },
+ "general": {
+ "allow_pr": {
+ "allow": "Atļaut izmaiņu pieprasījumiem",
+ "desc": "Ļaut izpildīt konvejerdarbus izmaiņu pieprasījumiem."
+ },
+ "cancel_prev": {
+ "cancel": "Atcelt iepriekšējos konvejerdarbus",
+ "desc": "Iespējojot šo pazīmi, tiks atcelti visi iepriekšējie konvejerdarbi, kuriem sakrīt notikums un konteksts."
+ },
+ "general": "Pamata",
+ "netrc_only_trusted": {
+ "desc": "Atļaut izmantot Git autorizāciju tikai uzticamiem konteineriem (ieteicams).",
+ "netrc_only_trusted": "Atļaut izmantot Git autorizāciju tikai uzticamiem konteineriem"
+ },
+ "pipeline_path": {
+ "default": "Pēc noklusējuma: .woodpecker/*.{'{yaml,yml}'} -> .woodpecker.yaml -> .woodpecker.yml",
+ "desc": "Ceļš uz konvejerdarba konfigurāciju, piemēram, {0}. Mapēm jābeidzas ar {0}.",
+ "desc_path_example": "mans/ceļš/",
+ "path": "Konvejerdarba ceļš"
+ },
+ "project": "Projekta iestatījumi",
+ "protected": {
+ "desc": "Nepieciešams apstiprināt visus konvejerdarbus pirms tie tiek izpildīti.",
+ "protected": "Aizsargāts"
+ },
+ "save": "Saglabāt iestatījumus",
+ "success": "Repozitorija iestatījumi tika saglabāti",
+ "timeout": {
+ "minutes": "minūtes",
+ "timeout": "Noildze"
+ },
+ "trusted": {
+ "desc": "Konvejerdarba konteineri tiks izpildīti ar paaugstinātām tiesībām (piemēram, piesaistīt servera direktorijas).",
+ "trusted": "Uzticams"
+ },
+ "visibility": {
+ "internal": {
+ "desc": "Tikai autorizēti lietotāji var piekļūt šim projektam.",
+ "internal": "Iekšējs"
+ },
+ "private": {
+ "desc": "Tikai lietotāji, kam ir tiesības uz repozitoriju, var piekļūt šim projektam.",
+ "private": "Privāts"
+ },
+ "public": {
+ "desc": "Ikviens var piekļūt projektam, arī neautorizētie lietotāji.",
+ "public": "Publisks"
+ },
+ "visibility": "Projekta redzamība"
+ },
+ "allow_deploy": {
+ "desc": "Atļaut publicēšanu no veiksmīgiem konvejerdarbiem. Lietot tikai ja Jūs uzticaties visiem lietotājiem ar push permisijām.",
+ "allow": "Atļaut publicēšanu"
+ }
+ },
+ "not_allowed": "Nav piekļuves šī repozitorija iestatījumiem",
+ "registries": {
+ "add": "Pievienot reģistru",
+ "address": {
+ "address": "Adrese",
+ "placeholder": "Reģistra adrese, piemēram, docker.io"
+ },
+ "created": "Reģistra autorizācijas dati pievienoti",
+ "credentials": "Reģistru autorizācijas dati",
+ "delete": "Dzēst reģistra autorizācijas datus",
+ "deleted": "Reģistra autorizācijas dati dzēsti",
+ "desc": "Reģistru autorizācijas dati var tikt izmantoti, lai izmantotu attēlos no privātiem reģistriem, konvjerdarbu soļos.",
+ "edit": "Labot reģistra autorizācijas datus",
+ "none": "Pašlaik nav pievienots neviens reģistrs.",
+ "registries": "Reģistri",
+ "save": "Saglabāt reģistru",
+ "saved": "Reģistra autorizācijas dati saglabāti",
+ "show": "Reģistru saraksts"
+ },
+ "secrets": {
+ "add": "Pievienot noslēpumu",
+ "created": "Noslēpums izveidots",
+ "delete": "Dzēst noslēpumu",
+ "delete_confirm": "Vai patiešām vēlaties dzēst šo noslēpumu?",
+ "deleted": "Noslēpums dzēsts",
+ "desc": "Noslēpumus var padot individuāliem konvejerdarba soļiem izpildes laikā kā vides mainīgos.",
+ "edit": "Labot noslēpumu",
+ "events": {
+ "events": "Pieejams šādiem notikumiem",
+ "pr_warning": "Uzmanieties, jo šādā veidā tas būs pieejams visiem cilvēkiem, kas var iesūtīt izmaiņu pieprasījumu."
+ },
+ "images": {
+ "desc": "Ar komatiem atdalīts saraksts ar attēliem, kam šis noslēpums būs pieejams, atstājot tukšu, tas būs pieejams visiem attēliem",
+ "images": "Pieejams šādiem attēliem"
+ },
+ "name": "Nosaukums",
+ "none": "Pagaidām nav neviena noslēpuma.",
+ "plugins_only": "Pieejams tikai spraudņiem",
+ "save": "Saglabāt noslēpumu",
+ "saved": "Noslēpums saglabāts",
+ "secrets": "Noslēpumi",
+ "show": "Noslēpumu saraksts",
+ "value": "Vērtība"
+ },
+ "settings": "Iestatījumi"
},
- "show": "Parādīt plānotos darbus"
- },
- "general": {
- "allow_pr": {
- "allow": "Atļaut izmaiņu pieprasījumiem",
- "desc": "Ļaut izpildīt konvejerdarbus izmaiņu pieprasījumiem."
- },
- "cancel_prev": {
- "cancel": "Atcelt iepriekšējos konvejerdarbus",
- "desc": "Iespējojot šo pazīmi, tiks atcelti visi iepriekšējie konvejerdarbi, kuriem sakrīt notikums un konteksts."
- },
- "general": "Pamata",
- "netrc_only_trusted": {
- "desc": "Atļaut izmantot Git autorizāciju tikai uzticamiem konteineriem (ieteicams).",
- "netrc_only_trusted": "Atļaut izmantot Git autorizāciju tikai uzticamiem konteineriem"
- },
- "pipeline_path": {
- "default": "Pēc noklusējuma: .woodpecker/*.{'{yaml,yml}'} -> .woodpecker.yaml -> .woodpecker.yml",
- "desc": "Ceļš uz konvejerdarba konfigurāciju, piemēram, {0}. Mapēm jābeidzas ar {0}.",
- "desc_path_example": "mans/ceļš/",
- "path": "Konvejerdarba ceļš"
- },
- "project": "Projekta iestatījumi",
- "protected": {
- "desc": "Nepieciešams apstiprināt visus konvejerdarbus pirms tie tiek izpildīti.",
- "protected": "Aizsargāts"
- },
- "save": "Saglabāt iestatījumus",
- "success": "Repozitorija iestatījumi tika saglabāti",
- "timeout": {
- "minutes": "minūtes",
- "timeout": "Noildze"
- },
- "trusted": {
- "desc": "Konvejerdarba konteineri tiks izpildīti ar paaugstinātām tiesībām, piemēram, piesaistīt servera direktorijas.",
- "trusted": "Uzticams"
- },
- "visibility": {
- "internal": {
- "desc": "Tikai autorizēti lietotāji var piekļūt šim projektam.",
- "internal": "Iekšējs"
- },
- "private": {
- "desc": "Tikai lietotāji, kam ir tiesības uz repozitoriju, var piekļūt šim projektam.",
- "private": "Privāts"
- },
- "public": {
- "desc": "Ikviens var piekļūt projektam, arī neautorizētie lietotāji.",
- "public": "Publisks"
- },
- "visibility": "Projekta redzamība"
- }
- },
- "not_allowed": "Nav piekļuves šī repozitorija iestatījumiem",
- "registries": {
- "add": "Pievienot reģistru",
- "address": {
- "address": "Adrese",
- "placeholder": "Reģistra adrese, piemēram, docker.io"
- },
- "created": "Reģistra autorizācijas dati pievienoti",
- "credentials": "Reģistru autorizācijas dati",
- "delete": "Dzēst reģistra autorizācijas datus",
- "deleted": "Reģistra autorizācijas dati dzēsti",
- "desc": "Reģistru autorizācijas dati var tikt izmantoti, lai izmantotu attēlos no privātiem reģistriem, konvjerdarbu soļos.",
- "edit": "Labot reģistra autorizācijas datus",
- "none": "Pašlaik nav pievienots neviens reģistrs.",
- "registries": "Reģistri",
- "save": "Saglabāt reģistru",
- "saved": "Reģistra autorizācijas dati saglabāti",
- "show": "Reģistru saraksts"
- },
- "secrets": {
- "add": "Pievienot noslēpumu",
- "created": "Noslēpums izveidots",
- "delete": "Dzēst noslēpumu",
- "delete_confirm": "Vai patiešām vēlaties dzēst šo noslēpumu?",
- "deleted": "Noslēpums dzēsts",
- "desc": "Noslēpumus var padot individuāliem konvejerdarba soļiem izpildes laikā kā vides mainīgos.",
- "edit": "Labot noslēpumu",
- "events": {
- "events": "Pieejams šādiem notikumiem",
- "pr_warning": "Uzmanieties, jo šādā veidā tas būs pieejams visiem cilvēkiem, kas var iesūtīt izmaiņu pieprasījumu."
- },
- "images": {
- "desc": "Ar komatiem atdalīts saraksts ar attēliem, kam šis noslēpums būs pieejams, atstājot tukšu, tas būs pieejams visiem attēliem",
- "images": "Pieejams šādiem attēliem"
- },
- "name": "Nosaukums",
- "none": "Pagaidām nav neviena noslēpuma.",
- "plugins_only": "Pieejams tikai spraudņiem",
- "save": "Saglabāt noslēpumu",
- "saved": "Noslēpums saglabāts",
- "secrets": "Noslēpumi",
- "show": "Noslēpumu saraksts",
- "value": "Vērtība"
- },
- "settings": "Iestatījumi"
+ "user_none": "Šai organizācijai/lietotājam pagaidām nav neviena projekta."
},
- "user_none": "Šai organizācijai/lietotājam pagaidām nav neviena projekta."
- },
- "repos": "Repozitoriji",
- "repositories": "Repozitoriji",
- "running_version": "Tiek izmantota Woodpecker CI versija {0}",
- "search": "Meklēt…",
- "time": {
- "days_short": "dien.",
- "hours_short": "st.",
- "min_short": "min.",
- "not_started": "nav uzsākts",
- "sec_short": "sek.",
- "template": "YYYY. [gada] D. MMMM, HH:mm z",
- "weeks_short": "ned."
- },
- "unknown_error": "Notika neparedzēta kļūda",
- "update_woodpecker": "Pieejama jauna Woodpecker CI versija {0}",
- "url": "URL",
- "user": {
- "access_denied": "Jums nav tiesību autorizēties",
- "internal_error": "Notikusi sistēmas iekšējā kļūda",
- "oauth_error": "Neizdevās autorizēties, izmantojot, OAuth piegādātāju",
- "settings": {
- "api": {
- "api": "API",
- "api_usage": "Piemērs API lietošanai",
- "cli_usage": "Piemērs komandrindas lietošanai",
- "desc": "Personīgā piekļuves pilnvara un API lietošana",
- "dl_cli": "Lejupielādēt komandrindas rīku",
- "reset_token": "Atiestatīt pilnvaru",
- "shell_setup": "Komandrindas iestatīšana",
- "shell_setup_before": "nepieciešamie komandrindas iestatīšanas soļi",
- "swagger_ui": "API dokumentācija",
- "token": "Personīgā piekļuves pilnvara"
- },
- "general": {
- "general": "Vispārīgi",
- "language": "Valoda",
- "theme": {
- "auto": "Noteikt automātiski",
- "dark": "Tumšā",
- "light": "Gaišā",
- "theme": "Tēma"
+ "repos": "Repozitorijas",
+ "repositories": "Repozitoriji",
+ "running_version": "Tiek izmantota Woodpecker {0}",
+ "search": "Meklēt…",
+ "time": {
+ "days_short": "dien.",
+ "hours_short": "st.",
+ "min_short": "min.",
+ "not_started": "nav uzsākts",
+ "sec_short": "sek.",
+ "template": "YYYY. [gada] D. MMMM, HH:mm z",
+ "weeks_short": "ned."
+ },
+ "unknown_error": "Notika neparedzēta kļūda",
+ "update_woodpecker": "Lūdzu atjauniniet Woodpecker instanci uz {0}",
+ "url": "URL",
+ "user": {
+ "access_denied": "Jums nav tiesību autorizēties",
+ "internal_error": "Notikusi sistēmas iekšējā kļūda",
+ "oauth_error": "Neizdevās autorizēties, izmantojot, OAuth piegādātāju",
+ "settings": {
+ "api": {
+ "api": "API",
+ "api_usage": "Piemērs API lietošanai",
+ "cli_usage": "Piemērs komandrindas lietošanai",
+ "desc": "Personīgā piekļuves pilnvara un API lietošana",
+ "dl_cli": "Lejupielādēt komandrindas rīku",
+ "reset_token": "Atiestatīt pilnvaru",
+ "shell_setup": "Komandrindas iestatīšana",
+ "shell_setup_before": "nepieciešamie komandrindas iestatīšanas soļi",
+ "swagger_ui": "API dokumentācija",
+ "token": "Personīgā piekļuves pilnvara"
+ },
+ "general": {
+ "general": "Vispārīgi",
+ "language": "Valoda",
+ "theme": {
+ "auto": "Noteikt automātiski",
+ "dark": "Tumšā",
+ "light": "Gaišā",
+ "theme": "Tēma"
+ }
+ },
+ "secrets": {
+ "add": "Pievienot noslēpumu",
+ "created": "Lietotāja noslēpums tika izveidots",
+ "deleted": "Lietotāja noslēpums tika izdzēsts",
+ "desc": "Lietotāja noslēpumi var tikt padoti personīgajiem konvejerdarbu soļiem kā vides mainīgie.",
+ "events": {
+ "events": "Pieejams notikumiem",
+ "pr_warning": "Esiet uzmanīgi atzīmējot šo pazīmi, jo tas var tikt izmantots, lai izmaiņu pieprasījumā atklātu šī noslēpuma vērtību, nepiederošām personām."
+ },
+ "images": {
+ "desc": "Ar komatu attdalīts saraksts ar attēlu nosaukumiem, kam šis noslēpums būs pieejams, atstājiet tukšu, lai tas būtu pieejams visiem attēliem",
+ "images": "Pieejams šādiem soļu attēliem"
+ },
+ "name": "Nosaukums",
+ "none": "Pagaidām nav neviena lietotāja noslēpuma.",
+ "plugins_only": "Pieejams tikai spraudņiem",
+ "save": "Saglabāt noslēpumu",
+ "saved": "Lietotāja noslēpums tika saglabāts",
+ "secrets": "Noslēpumi",
+ "show": "Parādīt noslēpumus",
+ "value": "Vērtība"
+ },
+ "settings": "Lietotāja iestatījumi",
+ "registries": {
+ "desc": "Lietotāju reģistra pilnvaras var tikt pielietotas privātos attēlos priekš personīgiem konvejerdarbiem."
+ },
+ "cli_and_api": {
+ "token": "Personīgās Piekļuves Žetons",
+ "api_usage": "Piemēra API pielietošana",
+ "cli_usage": "Piemēra CLI lietošana",
+ "download_cli": "Lejupielādēt CLI",
+ "reset_token": "Atiestatīt žetonu",
+ "swagger_ui": "Swagger UI",
+ "cli_and_api": "CLI & API",
+ "desc": "Personīgās Piekļuves Žetons, CLI un API pielietošna"
+ }
}
- },
- "secrets": {
+ },
+ "username": "Lietotājvārds",
+ "welcome": "Woodpecker",
+ "secrets": {
+ "secrets": "Noslēpumi",
+ "none": "Pašlaik nav vides noslēpumu.",
"add": "Pievienot noslēpumu",
- "created": "Lietotāja noslēpums tika izveidots",
- "deleted": "Lietotāja noslēpums tika izdzēsts",
- "desc": "Lietotāja noslēpumi var tikt padoti uz visiem lietotāja repozitoriju konvejerdarbu soļiem kā vides mainīgie.",
+ "save": "Saglabāt noslēpumu",
+ "show": "Rādīt noslēpumus",
+ "name": "Nosaukums",
+ "value": "Vērtība",
+ "delete_confirm": "Vai tiešām vēlaties dzēst šo noslēpumu?",
+ "saved": "Noslēpums saglabāts",
"events": {
- "events": "Pieejams notikumiem",
- "pr_warning": "Esiet uzmanīgi atzīmējot šo pazīmi, jo tas var tikt izmantots, lai izmaiņu pieprasījumā atklātu šī noslēpuma vērtību, nepiederošām personām."
+ "events": "Pieejams sekojošajos notikumos",
+ "pr_warning": "Lūdzu esiet uzmanīgi ar šo iestatījumu: ļaunprātīgs aktieris var iesniegt ļaunprātīgu pull request, kas atklās noslēpumus."
},
"images": {
- "desc": "Ar komatu attdalīts saraksts ar attēlu nosaukumiem, kam šis noslēpums būs pieejams, atstājiet tukšu, lai tas būtu pieejams visiem attēliem",
- "images": "Pieejams šādiem soļu attēliem"
+ "desc": "Saraksts ar attēliem, kuriem šis noslēpums ir pieejams. Atstāt tukšu, lai atļautu visos attēlos.",
+ "images": "Pieejams sekojošiem attēliem"
},
- "name": "Nosaukums",
- "none": "Pagaidām nav neviena lietotāja noslēpuma.",
- "plugins_only": "Pieejams tikai spraudņiem",
- "save": "Saglabāt noslēpumu",
- "saved": "Lietotāja noslēpums tika saglabāts",
- "secrets": "Noslēpumi",
- "show": "Parādīt noslēpumus",
- "value": "Vērtība"
- },
- "settings": "Lietotāja iestatījumi"
- }
- },
- "username": "Lietotāja vārds",
- "welcome": "Woodpecker"
+ "edit": "Rediģēt noslēpumu",
+ "desc": "Noslēpumi var tikt padoti individuāliem konvejerdarbu soļiem kā vides mainīgie.",
+ "deleted": "Noslēpums dzēsts",
+ "created": "Noslēpums izveidots",
+ "delete": "Dzēst noslēpumu"
+ },
+ "registries": {
+ "delete_confirm": "Vai tiešām vēlaties dzēst šo reģistru?",
+ "created": "Reģistra pilnvaras izveidotas",
+ "view": "Skatīt reģistru",
+ "edit": "Rediģēt reģistru",
+ "delete": "Dzēst reģistru",
+ "saved": "Reģistra pilnvaras saglabātas",
+ "deleted": "Reģistra pilnvaras dzēstas",
+ "save": "Saglabāt reģistru",
+ "add": "Pievienot reģistru",
+ "registries": "Reģistrijas",
+ "credentials": "Reģistriju pilnvaras",
+ "desc": "Reģistriju pilnvaras var tikt pievienotas pielietošanai privātos attēlos priekš konvejerdarbiem.",
+ "none": "Pašlaik nav rēģistrijas pilnvaru.",
+ "address": {
+ "address": "Adreses",
+ "desc": "Reģistrijas adreses (piem. docker.io)"
+ },
+ "show": "Rādīt reģistrijas"
+ },
+ "oauth_error": "Kļūda autentificējoties pret OAuth nodrošinātāju",
+ "internal_error": "Notikušas dažas iekšējās kļūdas",
+ "registration_closed": "Reģistrācijas process ir aizvērts",
+ "access_denied": "Jums nav atļaujas piekļūt šai instancei",
+ "invalid_state": "OAuth stāvoklis nav valīds",
+ "org_level_secret": "organizācijas noslēpums",
+ "cli_login_success": "Autorizēšanās CLI veiksmīga",
+ "login_to_cli": "Autorizēties CLI",
+ "login_to_cli_description": "Turpinot, Jūs autorizēs iekš CLI.",
+ "abort": "Aborts",
+ "cli_login_failed": "Autorizešanās pie CLI neizdevās",
+ "return_to_cli": "Jūs varat aizvērt šo cilni un atgriezties pie CLI.",
+ "settings": "Iestatījumi",
+ "login_with": "Autorizēties ar {forge}",
+ "empty_list": "Nav {entity}!",
+ "global_level_secret": "globāls noslēpums",
+ "cli_login_denied": "Autorizešanās pie CLI liegta"
}
diff --git a/web/src/assets/locales/ru.json b/web/src/assets/locales/ru.json
index 3772c78f6..78c0bc7b0 100644
--- a/web/src/assets/locales/ru.json
+++ b/web/src/assets/locales/ru.json
@@ -1,510 +1,643 @@
{
- "admin": {
- "settings": {
- "agents": {
- "add": "Добавить обработчик",
- "agents": "Обработчики",
- "backend": {
- "backend": "Бэкенд",
- "badge": "бэкенд"
- },
- "capacity": {
- "badge": "мощность",
- "capacity": "Мощность",
- "desc": "Максимальное количество конвейеров, выполняемых параллельно этим агентом."
- },
- "created": "Обработчик успешно добавлен",
- "delete_agent": "Удалить агент",
- "delete_confirm": "Вы действительно хотите удалить этот обработчик? Он больше не сможет подключаться к серверу.",
- "deleted": "Обработчик успешно удалён",
- "desc": "Обработчики, зарегистрированные на этом сервере",
- "edit_agent": "Редактировать агент",
- "id": "ID",
- "last_contact": "Последние подключение",
- "name": {
- "name": "Название",
- "placeholder": "Название обработчика"
- },
- "never": "Никогда",
- "no_schedule": {
- "name": "Отключить обработчик",
- "placeholder": "Запретить обработчику получать новые задачи"
- },
- "none": "Пока обработчики отсутствуют.",
- "platform": {
- "badge": "платформа",
- "platform": "Платформа"
- },
- "save": "Сохранить обработчик",
- "saved": "Обработчик сохранён",
- "show": "Показать обработчики",
- "token": "Токен",
- "version": "Версия"
- },
- "not_allowed": "У вас нет прав для доступа к настройкам сервера",
- "orgs": {
- "delete_confirm": "Вы действительно хотите удалить эту организацию? При этом также будут удалены все репозитории, принадлежащие этой организации.",
- "delete_org": "Удалить организацию",
- "deleted": "Организация удалена",
- "desc": "Организации, владеющие репозиториями на этом сервере",
- "none": "Здесь еще нет организаций.",
- "org_settings": "Настройки организации",
- "orgs": "Организации",
- "view": "Просмотр организации"
- },
- "queue": {
- "agent": "агент",
- "desc": "Задачи, ожидающие выполнения агентами",
- "pause": "Пауза",
- "paused": "Очередь при остановлена",
- "queue": "Очередь",
- "resume": "Продолжить",
- "resumed": "Очередь возобновлена",
- "stats": {
- "completed_count": "Завершённые задачи",
- "pending_count": "Ожидает",
- "running_count": "Выполняется",
- "waiting_on_deps_count": "Ожидает зависимостей",
- "worker_count": "Свободно"
- },
- "task_pending": "Задача ожидает",
- "task_running": "Задача выполняется",
- "task_waiting_on_deps": "Задача ожидает завершения выполнения зависимостей",
- "tasks": "Задачи",
- "waiting_for": "в ожидании"
- },
- "repos": {
- "desc": "Репозитории, которые включены или были включены на этом сервере",
- "disabled": "Отключено",
- "none": "Здесь еще нет репозиториев.",
- "repair": {
- "repair": "Исправить все",
- "success": "Репозитории исправлены"
- },
- "repos": "Репозитории",
- "settings": "Настройки репозитория",
- "view": "Просмотр репозитория"
- },
- "secrets": {
- "add": "Создать секрет",
- "created": "Глобальный секрет создан",
- "deleted": "Глобальный секрет удалён",
- "desc": "Глобальные секреты могут быть переданы всем репозиториям и отдельным этапам конвейера во время выполнения в качестве переменных окружения.",
- "events": {
- "events": "Доступен для следующих событий",
- "pr_warning": "Пожалуйста, будьте осторожны с этой опцией, так как злоумышленник может отправить вредоносный запрос на слияние, который раскроет ваши секреты."
- },
- "images": {
- "desc": "Список образов, для которых доступен этот секрет. Оставьте поле пустым, чтобы разрешить все образы",
- "images": "Доступен только для этих образов"
- },
- "name": "Название",
- "none": "Тут пока нет глобальных секретов.",
- "plugins_only": "Доступен только для расширений",
- "save": "Сохранить секрет",
- "saved": "Глобальный секрет сохранён",
- "secrets": "Секреты",
- "show": "Показать секрет",
- "value": "Значение",
- "warning": "Эти секреты будут доступны всем пользователям сервера."
- },
- "settings": "Настройки",
- "users": {
- "add": "Добавить пользователя",
- "admin": {
- "admin": "Администратор",
- "placeholder": "Пользователь является администратором"
- },
- "avatar_url": "URL аватара",
- "cancel": "Отмена",
- "created": "Пользователь успешно создан",
- "delete_confirm": "Вы действительно хотите удалить этого пользователя? При этом также будут удалены все репозитории, принадлежащие этому пользователю.",
- "delete_user": "Удалить пользователя",
- "deleted": "Пользователь успешно удалён",
- "desc": "Пользователи, зарегистрированные на этом сервере",
- "edit_user": "Изменить пользователя",
- "email": "Почта",
- "login": "Вход в систему",
- "none": "Пока тут нет пользователей.",
- "save": "Сохранить пользователя",
- "saved": "Пользователь сохранён",
- "show": "Показать пользователей",
- "users": "Пользователи"
- }
- }
- },
- "api": "API",
- "back": "Назад",
- "cancel": "Отменить",
- "default": "по умолчанию",
- "docs": "Документация",
- "documentation_for": "Документация о \"{topic}\"",
- "errors": {
- "not_found": "Серверу не удалось найти запрошенный объект"
- },
- "global_level_secret": "глобальный секрет",
- "info": "Информация",
- "login": "Вход",
- "logout": "Выйти",
- "not_found": {
- "back_home": "Вернуться на главную",
- "not_found": "Ошибка 404. Проверьте что ввели адрес правильно :-/"
- },
- "org": {
- "settings": {
- "not_allowed": "У вас нет прав для доступа к настройкам этой организации",
- "secrets": {
- "add": "Создать секрет",
- "created": "Секрет организации успешно добавлен",
- "deleted": "Секрет организации был удалён",
- "desc": "Секреты этой организации передаются всем шагам любого конвейера, принадлежащего этой организации, во время выполнения в качестве переменных среды.",
- "events": {
- "events": "Доступен для следующих событий",
- "pr_warning": "Пожалуйста, будьте осторожны с этой опцией, так как злоумышленник может отправить вредоносный запрос на слияние, который раскроет ваши секреты."
- },
- "images": {
- "desc": "Список образов, для которых доступен этот секрет. Оставьте поле пустым, чтобы разрешить все образы",
- "images": "Доступен только для этих образов"
- },
- "name": "Название",
- "none": "Тут пока нет секретов организации.",
- "plugins_only": "Доступен только для расширений",
- "save": "Сохранить секрет",
- "saved": "Секрет организации успешно обновлён",
- "secrets": "Секреты",
- "show": "Показать секрет",
- "value": "Значение"
- },
- "settings": "Настройки"
- }
- },
- "org_level_secret": "секрет организации",
- "password": "Пароль",
- "pipeline_feed": "Состояние конвейеров",
- "repo": {
- "activity": "Активность",
- "add": "Подключить репозиторий",
- "branches": "Ветви",
- "deploy_pipeline": {
- "enter_target": "Целевая среда развертывания",
- "title": "Вызвать событие развертывания для текущего конвейера #{pipelineId}",
- "trigger": "Развернуть",
- "variables": {
- "add": "Добавить переменную",
- "desc": "Укажите дополнительные переменные для использования в конвейере. Переменные с одинаковыми именами будут перезаписаны.",
- "name": "Имя переменой",
- "title": "Дополнительные переменные для конвейера",
- "value": "Значение переменой"
- }
+ "admin": {
+ "settings": {
+ "agents": {
+ "add": "Добавить обработчик",
+ "agents": "Обработчики",
+ "backend": {
+ "backend": "Бэкенд",
+ "badge": "бэкенд"
+ },
+ "capacity": {
+ "badge": "мощность",
+ "capacity": "Мощность",
+ "desc": "Максимальное количество конвейеров, выполняемых параллельно этим обработчиком."
+ },
+ "created": "Обработчик успешно добавлен",
+ "delete_agent": "Удалить обработчик",
+ "delete_confirm": "Вы действительно хотите удалить этот обработчик? Он больше не сможет подключаться к серверу.",
+ "deleted": "Обработчик успешно удалён",
+ "desc": "Обработчики, зарегистрированные на этом сервере.",
+ "edit_agent": "Редактировать обработчик",
+ "id": "ID",
+ "last_contact": "Последняя активность",
+ "name": {
+ "name": "Название",
+ "placeholder": "Название обработчика"
+ },
+ "never": "Никогда",
+ "no_schedule": {
+ "name": "Отключить обработчик",
+ "placeholder": "Запретить обработчику получать новые задачи"
+ },
+ "none": "Обработчиков пока нет.",
+ "platform": {
+ "badge": "платформа",
+ "platform": "Платформа"
+ },
+ "save": "Сохранить обработчик",
+ "saved": "Обработчик сохранён",
+ "show": "Показать обработчики",
+ "token": "Токен",
+ "version": "Версия",
+ "org": {
+ "badge": "орг"
+ },
+ "custom_labels": {
+ "custom_labels": "Пользовательские Метки",
+ "desc": "Пользовательские метки, установленные администратором обработчика при его запуске."
+ }
+ },
+ "not_allowed": "У вас нет прав доступа к настройкам сервера.",
+ "orgs": {
+ "delete_confirm": "Вы действительно хотите удалить эту организацию? При этом также будут удалены все репозитории, принадлежащие этой организации.",
+ "delete_org": "Удалить организацию",
+ "deleted": "Организация удалена",
+ "desc": "Организации, владеющие репозиториями на этом сервере.",
+ "none": "Организаций пока нет.",
+ "org_settings": "Настройки организации",
+ "orgs": "Организации",
+ "view": "Просмотр организации"
+ },
+ "queue": {
+ "agent": "обработчик",
+ "desc": "Задачи, ожидающие выполнения обработчиками",
+ "pause": "Приостановить",
+ "paused": "Очередь приостановлена",
+ "queue": "Очередь",
+ "resume": "Продолжить",
+ "resumed": "Очередь возобновлена",
+ "stats": {
+ "completed_count": "Завершённые задачи",
+ "pending_count": "Ожидает",
+ "running_count": "Выполняется",
+ "waiting_on_deps_count": "Ожидает зависимостей",
+ "worker_count": "Свободно"
+ },
+ "task_pending": "Задача ожидает",
+ "task_running": "Задача выполняется",
+ "task_waiting_on_deps": "Задача ожидает завершения выполнения зависимостей",
+ "tasks": "Задачи",
+ "waiting_for": "в ожидании"
+ },
+ "repos": {
+ "desc": "Репозитории, включенные в данный момент, или включавшиеся когда-либо ранее на этом сервере.",
+ "disabled": "Отключено",
+ "none": "Репозиториев пока нет.",
+ "repair": {
+ "repair": "Исправить все",
+ "success": "Репозитории исправлены"
+ },
+ "repos": "Репозитории",
+ "settings": "Настройки репозитория",
+ "view": "Просмотр репозитория"
+ },
+ "secrets": {
+ "add": "Создать секрет",
+ "created": "Глобальный секрет создан",
+ "deleted": "Глобальный секрет удалён",
+ "desc": "Глобальные секреты могут быть переданы в виде переменных окружения всем этапам конвейера во всех репозиториях.",
+ "events": {
+ "events": "Доступен для следующих событий",
+ "pr_warning": "Пожалуйста, будьте осторожны с этой опцией, так как злоумышленник может отправить вредоносный запрос на слияние, который раскроет ваши секреты."
+ },
+ "images": {
+ "desc": "Список образов, для которых доступен этот секрет. Оставьте поле пустым, чтобы разрешить все образы",
+ "images": "Доступен только для этих образов"
+ },
+ "name": "Название",
+ "none": "Тут пока нет глобальных секретов.",
+ "plugins_only": "Доступен только для расширений",
+ "save": "Сохранить секрет",
+ "saved": "Глобальный секрет сохранён",
+ "secrets": "Секреты",
+ "show": "Показать секрет",
+ "value": "Значение",
+ "warning": "Эти секреты будут доступны всем пользователям."
+ },
+ "settings": "Настройки",
+ "users": {
+ "add": "Добавить пользователя",
+ "admin": {
+ "admin": "Администратор",
+ "placeholder": "Пользователь является администратором"
+ },
+ "avatar_url": "URL аватара",
+ "cancel": "Отмена",
+ "created": "Пользователь успешно создан",
+ "delete_confirm": "Вы действительно хотите удалить этого пользователя? При этом также будут удалены все репозитории, принадлежащие этому пользователю.",
+ "delete_user": "Удалить пользователя",
+ "deleted": "Пользователь успешно удалён",
+ "desc": "Пользователи, зарегистрированные на этом сервере",
+ "edit_user": "Изменить пользователя",
+ "email": "Почта",
+ "login": "Вход в систему",
+ "none": "Пользователей пока нет.",
+ "save": "Сохранить пользователя",
+ "saved": "Пользователь сохранён",
+ "show": "Показать пользователей",
+ "users": "Пользователи"
+ },
+ "registries": {
+ "desc": "Можно добавить глобальные учётные данные реестра, чтобы иметь возможность использовать частные образы во всех конвейерах.",
+ "warning": "Эти учётные данные реестра будут доступны всем пользователям."
+ }
+ }
},
- "enable": {
- "disabled": "Отключено",
- "enable": "Подключить",
- "enabled": "Уже подключен",
- "list_reloaded": "Обновить список репозиториев",
- "reload": "Обновить репозитории",
- "success": "Репозиторий подключен"
+ "api": "API",
+ "back": "Назад",
+ "cancel": "Отменить",
+ "default": "по умолчанию",
+ "docs": "Документация",
+ "documentation_for": "Документация о «{topic}»",
+ "errors": {
+ "not_found": "Серверу не удалось найти запрошенный объект"
},
- "manual_pipeline": {
- "select_branch": "Выберите ветвь",
- "title": "Запустить конвейер вручную",
- "trigger": "Запустить конвейер",
- "variables": {
- "add": "Добавить переменную",
- "desc": "Укажите дополнительные переменные для использования в конвейере. Переменные с одинаковыми именами будут перезаписаны.",
- "name": "Имя переменой",
- "title": "Дополнительные переменные для конвейера",
- "value": "Значение переменой"
- }
+ "global_level_secret": "глобальный секрет",
+ "info": "Информация",
+ "login": "Вход",
+ "logout": "Выйти",
+ "not_found": {
+ "back_home": "Вернуться на главную",
+ "not_found": "Ошибка 404. Проверьте, что ввели адрес правильно :-/"
},
- "not_allowed": "У вас нет прав для доступа к этому репозиторию",
- "open_in_forge": "Открыть репозиторий в системе контроля версий",
- "pipeline": {
- "actions": {
- "cancel": "Отменить",
- "cancel_success": "Конвейер отменён",
- "canceled": "Этот шаг был пропущен.",
- "deploy": "Развертывание",
- "log_auto_scroll": "Автоматически пролистывать вниз",
- "log_auto_scroll_off": "Отключить автоматические пролистывание",
- "log_download": "Скачать",
- "restart": "Перезапустить",
- "restart_success": "Конвейер перезапущен"
- },
- "config": "Конфигурация",
- "errors": "Ошибки ({count})",
- "event": {
- "cron": "Задание Cron",
- "deploy": "Развёртывание (деплой)",
- "manual": "Ручной запуск",
- "pr": "Запросы на слияние",
- "push": "Новый коммит",
- "tag": "Тег"
- },
- "exit_code": "Код завершения {exitCode}",
- "files": "Изменённые файлы ({files})",
- "loading": "Загрузка…",
- "log_download_error": "Произошла ошибка при скачивании файла журнала",
- "log_title": "Журнал шагов",
- "no_files": "Никакие файлы не были изменены.",
- "no_pipeline_steps": "Нет доступных шагов конвеера!",
- "no_pipelines": "Ни один конвеер ещё не запущен.",
- "pipeline": "Конвейер №{pipelineId}",
- "pipelines_for": "Конвееры для ветви \"{branch}\"",
- "pipelines_for_pr": "Конвейер для запроса на слияние №{index}",
- "protected": {
- "approve": "Подтвердить",
- "approve_success": "Конвейер подтверждён",
- "awaits": "Конвейер ожидает подтверждения от разработчика!",
- "decline": "Отклонить",
- "decline_success": "Конвейер отклонён",
- "declined": "Этот конвейер был отклонён!",
- "review": "Обзор изменений"
- },
- "show_errors": "Показать ошибки",
- "status": {
- "blocked": "заблокирован",
- "declined": "отклонён",
- "error": "ошибка",
- "failure": "провален",
- "killed": "принудительно завершён",
- "pending": "ожидает",
- "running": "выполняется",
- "skipped": "пропущен",
- "started": "запускается",
- "status": "Состояние: {status}",
- "success": "успешно выполнен"
- },
- "step_not_started": "Этот шаг ещё не запущен.",
- "tasks": "Задачи",
- "warnings": "Предупреждения ({count})",
- "we_got_some_errors": "О нет, у нас возникли ошибки!"
+ "org": {
+ "settings": {
+ "not_allowed": "У вас нет прав для доступа к настройкам этой организации",
+ "secrets": {
+ "add": "Создать секрет",
+ "created": "Секрет организации успешно добавлен",
+ "deleted": "Секрет организации был удалён",
+ "desc": "Секреты этой организации могут быть переданы в виде переменных окружения всем шагам любого конвейера, принадлежащего этой организации.",
+ "events": {
+ "events": "Доступен для следующих событий",
+ "pr_warning": "Пожалуйста, будьте осторожны с этой опцией, так как злоумышленник может отправить вредоносный запрос на слияние, который раскроет ваши секреты."
+ },
+ "images": {
+ "desc": "Список образов, для которых доступен этот секрет. Оставьте поле пустым, чтобы разрешить все образы",
+ "images": "Доступен только для этих образов"
+ },
+ "name": "Название",
+ "none": "Тут пока нет секретов организации.",
+ "plugins_only": "Доступен только для расширений",
+ "save": "Сохранить секрет",
+ "saved": "Секрет организации успешно обновлён",
+ "secrets": "Секреты",
+ "show": "Показать секрет",
+ "value": "Значение"
+ },
+ "settings": "Настройки",
+ "registries": {
+ "desc": "Можно добавить учётные данные реестра для организации, чтобы иметь возможность использовать частные образы во всех конвейерах этой организации."
+ },
+ "agents": {
+ "desc": "Обработчики, зарегистрированные для этой организации."
+ }
+ }
},
- "pull_requests": "Запросы на слияние",
- "settings": {
- "actions": {
- "actions": "Действия",
- "delete": {
- "confirm": "Все данные будут потеряны после этого действия!!!\n\nВы действительно хотите продолжить?",
- "delete": "Удалить репозиторий",
- "success": "Репозиторий удалён"
- },
- "disable": {
- "disable": "Отключить репозиторий",
- "success": "Репозиторий отключен"
+ "org_level_secret": "секрет организации",
+ "password": "Пароль",
+ "pipeline_feed": "Состояние конвейеров",
+ "repo": {
+ "activity": "Активность",
+ "add": "Подключить репозиторий",
+ "branches": "Ветви",
+ "deploy_pipeline": {
+ "enter_target": "Целевая среда развёртывания",
+ "title": "Вызвать событие развёртывания для текущего конвейера #{pipelineId}",
+ "trigger": "Развернуть",
+ "variables": {
+ "add": "Добавить переменную",
+ "desc": "Укажите дополнительные переменные для использования в конвейере. Переменные с одинаковыми именами будут перезаписаны.",
+ "name": "Имя переменной",
+ "title": "Дополнительные переменные для конвейера",
+ "value": "Значение переменной",
+ "delete": "Удалить переменную"
+ },
+ "enter_task": "Задача на развёртывание"
},
"enable": {
- "enable": "Включить репозиторий",
- "success": "Репозиторий включён"
+ "disabled": "Отключено",
+ "enable": "Подключить",
+ "enabled": "Уже подключен",
+ "list_reloaded": "Обновить список репозиториев",
+ "reload": "Обновить репозитории",
+ "success": "Репозиторий подключен"
},
- "repair": {
- "repair": "Восстановить репозиторий",
- "success": "Репозиторий восстановлен"
- }
- },
- "badge": {
- "badge": "Бейдж",
- "branch": "Ветвь",
- "type": "Синтаксис",
- "type_html": "HTML",
- "type_markdown": "Markdown",
- "type_url": "URL"
- },
- "crons": {
- "add": "Добавить задание Cron",
- "branch": {
- "placeholder": "Ветвь (если пусто, используется ветвь по умолчанию)",
- "title": "Ветвь"
+ "manual_pipeline": {
+ "select_branch": "Выберите ветвь",
+ "title": "Запустить конвейер вручную",
+ "trigger": "Запустить конвейер",
+ "variables": {
+ "add": "Добавить переменную",
+ "desc": "Укажите дополнительные переменные для использования в конвейере. Переменные с одинаковыми именами будут перезаписаны.",
+ "name": "Имя переменной",
+ "title": "Дополнительные переменные для конвейера",
+ "value": "Значение переменной",
+ "delete": "Удалить переменную"
+ },
+ "show_pipelines": "Показать конвейеры"
},
- "created": "Задача cron создана",
- "crons": "Задания Cron",
- "delete": "Удалить задачу cron",
- "deleted": "Задача cron удалена",
- "desc": "Задания Cron можно использовать для регулярного запуска конвейеров.",
- "edit": "Редактировать задачу cron",
- "name": {
- "name": "Название",
- "placeholder": "Имя задачи cron"
+ "not_allowed": "У вас нет прав для доступа к этому репозиторию",
+ "open_in_forge": "Открыть репозиторий в платформе разработки",
+ "pipeline": {
+ "actions": {
+ "cancel": "Отменить",
+ "cancel_success": "Конвейер отменён",
+ "canceled": "Этот шаг был отменён.",
+ "deploy": "Развёртывание",
+ "log_auto_scroll": "Автоматически пролистывать вниз",
+ "log_auto_scroll_off": "Отключить автоматические пролистывание",
+ "log_download": "Скачать",
+ "restart": "Перезапустить",
+ "restart_success": "Конвейер перезапущен",
+ "log_delete": "Удалить"
+ },
+ "config": "Конфигурация",
+ "errors": "Ошибки ({count})",
+ "event": {
+ "cron": "Задание cron",
+ "deploy": "Развёртывание (деплой)",
+ "manual": "Ручной запуск",
+ "pr": "Запросы на слияние",
+ "push": "Новый коммит",
+ "tag": "Тег",
+ "pr_closed": "Запрос на слияние удовлетворён / закрыт",
+ "release": "Релиз"
+ },
+ "exit_code": "Код завершения {exitCode}",
+ "files": "Изменённые файлы ({files})",
+ "loading": "Загрузка…",
+ "log_download_error": "Произошла ошибка при скачивании файла журнала",
+ "log_title": "Журнал шага",
+ "no_files": "Никакие файлы не были изменены.",
+ "no_pipeline_steps": "Нет доступных шагов конвеера!",
+ "no_pipelines": "Ни один конвеер ещё не запущен.",
+ "pipeline": "Конвейер №{pipelineId}",
+ "pipelines_for": "Конвееры для ветви «{branch}»",
+ "pipelines_for_pr": "Конвейер для запроса на слияние №{index}",
+ "protected": {
+ "approve": "Подтвердить",
+ "approve_success": "Конвейер подтверждён",
+ "awaits": "Конвейер ожидает подтверждения от разработчика!",
+ "decline": "Отклонить",
+ "decline_success": "Конвейер отклонён",
+ "declined": "Этот конвейер был отклонён!",
+ "review": "Обзор изменений"
+ },
+ "show_errors": "Показать ошибки",
+ "status": {
+ "blocked": "заблокирован",
+ "declined": "отклонён",
+ "error": "ошибка",
+ "failure": "провален",
+ "killed": "принудительно завершён",
+ "pending": "ожидает",
+ "running": "выполняется",
+ "skipped": "пропущен",
+ "started": "запущен",
+ "status": "Состояние: {status}",
+ "success": "успешно выполнен"
+ },
+ "step_not_started": "Этот шаг ещё не запущен.",
+ "tasks": "Задачи",
+ "warnings": "Предупреждения ({count})",
+ "we_got_some_errors": "О нет, у нас возникли ошибки!",
+ "no_logs": "Нет записей журнала",
+ "created": "Создано: {created}",
+ "duration": "Время работы конвейера",
+ "log_delete_confirm": "Вы действительно хотите удалить журналы этого шага?",
+ "log_delete_error": "При удалении журналов шага произошла ошибка",
+ "debug": {
+ "metadata_exec_desc": "Скачайте метаданные конвейера, чтобы запустить его на своей системе. Это даст вам возможность отладить проблемы и проверить изменения перед их публикацией.",
+ "title": "Отладка",
+ "download_metadata": "Скачать метаданные",
+ "metadata_download_successful": "Метаданные успешно загружены",
+ "metadata_download_error": "Ошибка загрузки метаданных",
+ "no_permission": "У вас нет доступа к отладочной информации.",
+ "metadata_exec_title": "Локальный перезапуск конвейера"
+ }
},
- "next_exec": "Следующий запуск",
- "none": "Пока нет ни одной задачи cron.",
- "not_executed_yet": "Ещё не запущено",
- "run": "Запустить сейчас",
- "save": "Сохранить задачу cron",
- "saved": "Задача cron сохранена",
- "schedule": {
- "placeholder": "Расписание",
- "title": "Расписание (по UTC)"
+ "pull_requests": "Запросы на слияние",
+ "settings": {
+ "actions": {
+ "actions": "Действия",
+ "delete": {
+ "confirm": "Все данные будут потеряны после этого действия!!!\n\nВы действительно хотите продолжить?",
+ "delete": "Удалить репозиторий",
+ "success": "Репозиторий удалён"
+ },
+ "disable": {
+ "disable": "Отключить репозиторий",
+ "success": "Репозиторий отключен"
+ },
+ "enable": {
+ "enable": "Включить репозиторий",
+ "success": "Репозиторий включён"
+ },
+ "repair": {
+ "repair": "Восстановить репозиторий",
+ "success": "Репозиторий восстановлен"
+ }
+ },
+ "badge": {
+ "badge": "Бейдж",
+ "branch": "Ветвь",
+ "type": "Синтаксис",
+ "type_html": "HTML",
+ "type_markdown": "Markdown",
+ "type_url": "URL"
+ },
+ "crons": {
+ "add": "Добавить задачу cron",
+ "branch": {
+ "placeholder": "Ветвь (если пусто, используется ветвь по умолчанию)",
+ "title": "Ветвь"
+ },
+ "created": "Задача cron создана",
+ "crons": "Задачи cron",
+ "delete": "Удалить задачу cron",
+ "deleted": "Задача cron удалена",
+ "desc": "Задачи cron можно использовать для регулярного запуска конвейеров.",
+ "edit": "Редактировать задачу cron",
+ "name": {
+ "name": "Название",
+ "placeholder": "Имя задачи cron"
+ },
+ "next_exec": "Следующий запуск",
+ "none": "Пока нет ни одной задачи cron.",
+ "not_executed_yet": "Ещё не запущено",
+ "run": "Запустить сейчас",
+ "save": "Сохранить задачу cron",
+ "saved": "Задача cron сохранена",
+ "schedule": {
+ "placeholder": "Расписание",
+ "title": "Расписание (по UTC)"
+ },
+ "show": "Показать задачи cron"
+ },
+ "general": {
+ "allow_pr": {
+ "allow": "Разрешить запросы на слияние",
+ "desc": "Конвейеры смогут запускаться для запросов на слияние."
+ },
+ "cancel_prev": {
+ "cancel": "Принудительно завершить все предыдущие конвейеры",
+ "desc": "Позволяет отменить уже отложенные и запущенные конвейеры того же события и контекста перед запуском нового конвейера."
+ },
+ "general": "Главное",
+ "netrc_only_trusted": {
+ "desc": "Вводите учетные данные netrc только внутри контейнеров, которым вы доверяете (рекомендуется).",
+ "netrc_only_trusted": "Вводите учетные данные netrc только внутри контейнеров, которым вы доверяете"
+ },
+ "pipeline_path": {
+ "default": "По умолчанию: .woodpecker/*.{'{yaml,yml}'} -> .woodpecker.yaml -> .woodpecker.yml",
+ "desc": "Путь к конфигурации вашего конвейера (например: {0}). При указании директории путь должен заканчиваться символом {1}.",
+ "desc_path_example": "мой/путь/",
+ "path": "Конфигурация конвейера"
+ },
+ "project": "Настройки проекта",
+ "protected": {
+ "desc": "Каждый конвейер должен быть проверен до начала выполнения.",
+ "protected": "Защищён"
+ },
+ "save": "Сохранить настройки",
+ "success": "Настройки репозитория обновлены",
+ "timeout": {
+ "minutes": "минуты",
+ "timeout": "Время ожидания"
+ },
+ "trusted": {
+ "desc": "Доверенные конвейеры получат доступ к дополнительным возможностям (например, монтированию томов).",
+ "trusted": "Доверенный",
+ "network": {
+ "network": "Сеть",
+ "desc": "Контейнеры конвейера получат доступ к сетевым привилегиям, таким как изменение настроек DNS."
+ },
+ "security": {
+ "security": "Безопасность",
+ "desc": "Контейнеры конвейера получат доступ к привилегиям безопасности."
+ },
+ "volumes": {
+ "volumes": "Томы",
+ "desc": "Контейнеры конвейера получат доступ к привилегиям томов."
+ }
+ },
+ "visibility": {
+ "internal": {
+ "desc": "Только пользователи, вошедшие в систему, смогут видеть этот проект.",
+ "internal": "Внутренний"
+ },
+ "private": {
+ "desc": "Только вы и другие владельцы этого репозитория смогут видеть его.",
+ "private": "Приватный"
+ },
+ "public": {
+ "desc": "Любой незарегистрированный пользователь сможет увидеть этот проект.",
+ "public": "Публичный"
+ },
+ "visibility": "Видимость проекта"
+ },
+ "allow_deploy": {
+ "allow": "Разрешить развёртывание",
+ "desc": "Разрешить развёртывание из успешных конвейеров. Используйте только в том случае, если вы доверяете всем пользователям с push-доступом."
+ }
+ },
+ "not_allowed": "У вас нет права доступа к настройкам этого репозитория",
+ "registries": {
+ "add": "Добавить реестр",
+ "address": {
+ "address": "Адрес",
+ "placeholder": "Адрес реестра (например: docker.io)"
+ },
+ "created": "Данные для доступа к реестру добавлены",
+ "credentials": "Учётные данные для авторизации в реестре",
+ "delete": "Удалить реестр",
+ "deleted": "Данные для доступа к реестру удалены",
+ "desc": "Можно добавить учетные данные для доступа к реестру, чтобы использовать приветные образы из этого реестра в конвейере.",
+ "edit": "Изменить реестр",
+ "none": "Пока тут нет учётных данных для доступа к реестрам.",
+ "registries": "Реестры с образами",
+ "save": "Сохранить реестр",
+ "saved": "Данные для доступа к реестру сохранены",
+ "show": "Показать реестры"
+ },
+ "secrets": {
+ "add": "Создать секрет",
+ "created": "Секрет создан",
+ "delete": "Удалить секрет",
+ "delete_confirm": "Вы действительно хотите удалить этот секрет?",
+ "deleted": "Секрет успешно удалён",
+ "desc": "Секреты могут быть переданы отдельным этапам конвейера во время выполнения в качестве переменных окружения.",
+ "edit": "Изменить секрет",
+ "events": {
+ "events": "Доступен для следующих событий",
+ "pr_warning": "Пожалуйста, будьте осторожны с этой опцией, так как злоумышленник может отправить вредоносный запрос на слияние, который раскроет ваши секреты."
+ },
+ "images": {
+ "desc": "Список образов, для которых доступен этот секрет. Оставьте поле пустым, чтобы разрешить все образы",
+ "images": "Доступен только для этих образов"
+ },
+ "name": "Название",
+ "none": "Пока тут нет секретов.",
+ "plugins_only": "Доступен только для расширений",
+ "save": "Сохранить секрет",
+ "saved": "Секрет успешно сохранён",
+ "secrets": "Секреты",
+ "show": "Показать секрет",
+ "value": "Значение"
+ },
+ "settings": "Настройки"
},
- "show": "Показать задания Cron"
- },
- "general": {
- "allow_pr": {
- "allow": "Разрешить запросы на слияние",
- "desc": "Конвейеры смогут запускаться для запросов на слияние."
- },
- "cancel_prev": {
- "cancel": "Принудительно завершить все предыдущие конвейеры",
- "desc": "Позволяет отменить уже отложенные и запущенные конвейеры того же события и контекста перед запуском нового конвейера."
- },
- "general": "Главное",
- "netrc_only_trusted": {
- "desc": "Вводите учетные данные netrc только внутри контейнеров которым вы доверяете (рекомендуется).",
- "netrc_only_trusted": "Вводите учетные данные netrc только внутри контейнеров которым вы доверяете"
- },
- "pipeline_path": {
- "default": "По умолчанию: .woodpecker/*.{'{yaml,yml}'} -> .woodpecker.yaml -> .woodpecker.yml",
- "desc": "Путь к конфигурации вашего конвейера (например: {0}). При указании директории путь должен заканчиваться символом {1}.",
- "desc_path_example": "мой/путь/",
- "path": "Конфигурация конвейера"
- },
- "project": "Настройки проекта",
- "protected": {
- "desc": "Каждый конвейер должен быть проверен до того как он будет выполнен.",
- "protected": "Защищён"
- },
- "save": "Сохранить настройки",
- "success": "Настройки репозитория обновлены",
- "timeout": {
- "minutes": "минуты",
- "timeout": "Время ожидания"
- },
- "trusted": {
- "desc": "Доверенные конвейеры получат доступ к дополнительным возможностям. Например конвейер сможет выполнять монтирование томов.",
- "trusted": "Доверенный"
- },
- "visibility": {
- "internal": {
- "desc": "Только пользователи, вошедшие в систему, смогут видеть этот проект.",
- "internal": "Внутренний"
- },
- "private": {
- "desc": "Только вы и другие владельцы этого репозитория смогут видеть его.",
- "private": "Приватный"
- },
- "public": {
- "desc": "Любой незарегистрированный пользователь сможет увидеть этот проект.",
- "public": "Публичный"
- },
- "visibility": "Видимость проекта"
- }
- },
- "not_allowed": "У вас нет права доступа к настройкам этого репозитория",
- "registries": {
- "add": "Добавить реестр",
- "address": {
- "address": "Адрес",
- "placeholder": "Адрес реестра (например: docker.io)"
- },
- "created": "Данные для доступа к реестру добавлены",
- "credentials": "Учётные данные для авторизации в реестре",
- "delete": "Удалить реестр",
- "deleted": "Данные для доступа к реестру удалены",
- "desc": "Можно добавить учетные данные для доступа к реестру, чтобы использовать приветные образы из этого реестра в конвейере.",
- "edit": "Изменить реестр",
- "none": "Пока тут нет учётных данных для доступа к реестрам.",
- "registries": "Реестры с образами",
- "save": "Сохранить реестр",
- "saved": "Данные для доступа к реестру сохранены",
- "show": "Показать реестры"
- },
- "secrets": {
- "add": "Создать секрет",
- "created": "Секрет создан",
- "delete": "Удалить секрет",
- "delete_confirm": "Вы действительно хотите удалить этот секрет?",
- "deleted": "Секрет успешно удалён",
- "desc": "Секреты могут быть переданы отдельным этапам конвейера во время выполнения в качестве переменных окружения.",
- "edit": "Изменить секрет",
- "events": {
- "events": "Доступен для следующих событий",
- "pr_warning": "Пожалуйста, будьте осторожны с этой опцией, так как злоумышленник может отправить вредоносный запрос на слияние, который раскроет ваши секреты."
- },
- "images": {
- "desc": "Список образов, для которых доступен этот секрет. Оставьте поле пустым, чтобы разрешить все образы",
- "images": "Доступен только для этих образов"
- },
- "name": "Название",
- "none": "Пока тут нет секретов.",
- "plugins_only": "Доступен только для расширений",
- "save": "Сохранить секрет",
- "saved": "Секрет успешно сохранён",
- "secrets": "Секреты",
- "show": "Показать секрет",
- "value": "Значение"
- },
- "settings": "Настройки"
+ "user_none": "Эта организация / пользователь не имеет ни одного проекта."
},
- "user_none": "Эта организация / пользователь не имеет ни одного проекта."
- },
- "repos": "Репозитории",
- "repositories": "Репозитории",
- "running_version": "Вы управляете Woodpecker {0}",
- "search": "Поиск…",
- "time": {
- "days_short": "д.",
- "hours_short": "ч.",
- "min_short": "мин.",
- "not_started": "не запускался ни разу",
- "sec_short": "сек.",
- "template": "D MMM, YYYY, HH:mm z",
- "weeks_short": "нед."
- },
- "unknown_error": "Произошла неизвестная ошибка",
- "update_woodpecker": "Пожалуйста, обновите свой экземпляр Woodpecker до {0}",
- "url": "URL",
- "user": {
- "access_denied": "У вас нет прав для входа в систему",
- "internal_error": "Произошла внутренняя ошибка",
- "oauth_error": "Ошибка при аутентификации через OAuth провайдера",
- "settings": {
- "api": {
- "api": "API",
- "api_usage": "Пример использования API",
- "cli_usage": "Пример использования CLI",
- "desc": "Токен персонального доступа и использование API",
- "dl_cli": "Загрузить CLI",
- "reset_token": "Сбросить токен",
- "shell_setup": "Настройка оболочки",
- "shell_setup_before": "выполните шаги по настройке оболочки перед",
- "swagger_ui": "Интерфейс Swagger",
- "token": "Токен персонального доступа"
- },
- "general": {
- "general": "Главное",
- "language": "Язык",
- "theme": {
- "auto": "Авто",
- "dark": "Темная",
- "light": "Светлая",
- "theme": "Тема"
+ "repos": "Репозитории",
+ "repositories": "Репозитории",
+ "running_version": "Вы используете Woodpecker {0}",
+ "search": "Поиск…",
+ "time": {
+ "days_short": "д.",
+ "hours_short": "ч.",
+ "min_short": "мин.",
+ "not_started": "ещё не запускался",
+ "sec_short": "сек.",
+ "template": "D MMM, YYYY, HH:mm z",
+ "weeks_short": "нед."
+ },
+ "unknown_error": "Произошла неизвестная ошибка",
+ "update_woodpecker": "Пожалуйста, обновите свой экземпляр Woodpecker до {0}",
+ "url": "URL",
+ "user": {
+ "access_denied": "У вас нет прав для входа в систему",
+ "internal_error": "Произошла внутренняя ошибка",
+ "oauth_error": "Ошибка при аутентификации через OAuth провайдера",
+ "settings": {
+ "api": {
+ "api": "API",
+ "api_usage": "Пример использования API",
+ "cli_usage": "Пример использования CLI",
+ "desc": "Токен персонального доступа и использование API",
+ "dl_cli": "Загрузить CLI",
+ "reset_token": "Сбросить токен",
+ "shell_setup": "Настройка оболочки",
+ "shell_setup_before": "выполните шаги по настройке оболочки перед",
+ "swagger_ui": "Интерфейс Swagger",
+ "token": "Токен персонального доступа"
+ },
+ "general": {
+ "general": "Главное",
+ "language": "Язык",
+ "theme": {
+ "auto": "Авто",
+ "dark": "Тёмная",
+ "light": "Светлая",
+ "theme": "Тема"
+ }
+ },
+ "secrets": {
+ "add": "Добавить секрет",
+ "created": "Секрет пользователя создан",
+ "deleted": "Секрет пользователя удален",
+ "desc": "Пользовательские секреты могут быть переданы в виде переменных окружения всем этапам конвейеров во всех репозиториях пользователя.",
+ "events": {
+ "events": "Доступно на следующих событий",
+ "pr_warning": "Пожалуйста, будьте осторожны с этой опцией, так как злоумышленник может отправить вредоносный запрос на слияние, который раскроет ваши секреты."
+ },
+ "images": {
+ "desc": "Список образов, для которых доступен этот секрет. Оставьте поле пустым, чтобы разрешить все образы",
+ "images": "Доступно для следующих образов"
+ },
+ "name": "Имя",
+ "none": "Секретов пользователей пока нет.",
+ "plugins_only": "Доступно только для плагинов",
+ "save": "Сохранить секрет",
+ "saved": "Секрет пользователя сохранен",
+ "secrets": "Секреты",
+ "show": "Показать секреты",
+ "value": "Значение"
+ },
+ "settings": "Настройки пользователя",
+ "cli_and_api": {
+ "token": "Персональный токен доступа",
+ "cli_and_api": "Командная строка и API",
+ "desc": "Персональный токен доступа, командная строка и API",
+ "download_cli": "Скачать интерфейс командной строки",
+ "cli_usage": "Пример использования командной строки",
+ "api_usage": "Пример использования API",
+ "reset_token": "Сбросить токен",
+ "swagger_ui": "Интерфейс Swagger"
+ },
+ "registries": {
+ "desc": "Добавление учётных данных реестра для пользователя даст возможность использовать частные образы во всех конвейерах пользователя."
+ },
+ "agents": {
+ "desc": "Обработчики, зарегистрированные для репозиториев вашей учётной записи."
+ }
}
- },
- "secrets": {
- "add": "Добавить секрет",
- "created": "Секрет пользователя создан",
- "deleted": "Секрет пользователя удален",
- "desc": "Пользовательские секреты могут быть переданы всем отдельным этапам конвейера пользовательского репозитория во время выполнения в качестве переменных окружения.",
- "events": {
- "events": "Доступно на следующих событий",
- "pr_warning": "Пожалуйста, будьте осторожны с этой опцией, так как злоумышленник может отправить вредоносный запрос на слияние, который раскроет ваши секреты."
- },
- "images": {
- "desc": "Список образов, для которых доступен этот секрет. Оставьте поле пустым, чтобы разрешить все образы",
- "images": "Доступно для следующих образов"
- },
- "name": "Имя",
- "none": "Секретов пользователей пока нет.",
- "plugins_only": "Доступно только для плагинов",
+ },
+ "username": "Имя пользователя",
+ "welcome": "Добро пожаловать в Woodpecker",
+ "secrets": {
+ "desc": "Секреты можно передавать отдельным шагам конвейера в качестве переменных окружения.",
"save": "Сохранить секрет",
- "saved": "Секрет пользователя сохранен",
- "secrets": "Секреты",
"show": "Показать секреты",
- "value": "Значение"
- },
- "settings": "Настройки пользователя"
- }
- },
- "username": "Имя пользователя",
- "welcome": "Добро пожаловать в Woodpecker"
+ "name": "Имя",
+ "value": "Значение",
+ "delete_confirm": "Вы действительно хотите удалить этот секрет?",
+ "deleted": "Секрет удалён",
+ "created": "Секрет создан",
+ "saved": "Секрет сохранён",
+ "add": "Добавить секрет",
+ "images": {
+ "images": "Доступно следующим образам",
+ "desc": "Список образов, которым доступен этот секрет; оставьте пустым, чтобы разрешить доступ всем образам."
+ },
+ "secrets": "Секреты",
+ "none": "Секретов пока нет.",
+ "events": {
+ "events": "Доступно следующим событиям",
+ "pr_warning": "Пожалуйста, будьте осторожны с этой опцией: злоумышленник может раскрыть ваши секреты, отправив вредоносный запрос на слияние."
+ },
+ "edit": "Редактировать секрет",
+ "delete": "Удалить секрет",
+ "plugins": {
+ "images": "Доступно только следующим плагинам",
+ "desc": "Список образов плагинов, которым доступен этот секрет. Оставьте значение пустым, чтобы разрешить доступ для всех плагинов и для обычных шагов конвейера."
+ }
+ },
+ "internal_error": "Произошла внутренняя ошибка",
+ "registration_closed": "Регистрация закрыта",
+ "registries": {
+ "address": {
+ "desc": "Адрес реестра (например, docker.io)",
+ "address": "Адрес"
+ },
+ "show": "Показать реестры",
+ "save": "Сохранить реестр",
+ "add": "Добавить реестр",
+ "view": "Просмотр реестра",
+ "none": "Учётных данных реестра пока нет.",
+ "registries": "Реестры",
+ "credentials": "Учётные данные реестра",
+ "desc": "Можно добавить учётные данные реестра, чтобы использовать частные образы в конвейерах.",
+ "edit": "Редактировать реестр",
+ "delete": "Удалить реестр",
+ "delete_confirm": "Вы действительно хотите удалить этот реестр?",
+ "created": "Учётные данные реестра созданы",
+ "saved": "Учётные данные реестра сохранены",
+ "deleted": "Учётные данные реестра удалены"
+ },
+ "login_to_cli": "Вход через командную строку",
+ "abort": "Прервать",
+ "cli_login_success": "Успешный вход в интерфейс командной строки",
+ "cli_login_failed": "Вход в интерфейс командной строки не удался",
+ "return_to_cli": "Теперь вы можете закрыть эту вкладку и вернуться в командную строку.",
+ "settings": "Настройки",
+ "login_to_cli_description": "Продолжите, чтобы войти через командную строку.",
+ "cli_login_denied": "Вход через командную строку запрещён",
+ "invalid_state": "Некорректное состояние OAuth",
+ "oauth_error": "Ошибка при аутентификации в провайдере OAuth",
+ "access_denied": "Вам не разрешён доступ к этому экземпляру",
+ "empty_list": "{entity} не найдены!",
+ "login_with": "Вход через {forge}"
}
diff --git a/web/src/components/admin/settings/AdminAgentsTab.vue b/web/src/components/admin/settings/AdminAgentsTab.vue
index 87e7954ec..53cd48f17 100644
--- a/web/src/components/admin/settings/AdminAgentsTab.vue
+++ b/web/src/components/admin/settings/AdminAgentsTab.vue
@@ -1,202 +1,23 @@
-
-
-
-
-
-
-
-
- {{ agent.name || `Agent ${agent.id}` }}
-
-
-
-
-
-
- {{
- agent.last_contact ? date.timeAgo(agent.last_contact * 1000) : $t('admin.settings.agents.never')
- }}
-
-
-
-
-
-
{{ $t('admin.settings.agents.none') }}
-
-
-
+
diff --git a/web/src/components/admin/settings/AdminQueueTab.vue b/web/src/components/admin/settings/AdminQueueTab.vue
index 5a08559cd..b11f8d509 100644
--- a/web/src/components/admin/settings/AdminQueueTab.vue
+++ b/web/src/components/admin/settings/AdminQueueTab.vue
@@ -110,7 +110,12 @@ const tasks = computed(() => {
_tasks.push(...queueInfo.value.waiting_on_deps.map((task) => ({ ...task, status: 'waiting_on_deps' })));
}
- return _tasks.sort((a, b) => a.id - b.id);
+ return _tasks
+ .map((task) => ({
+ ...task,
+ labels: Object.fromEntries(Object.entries(task.labels).filter(([key]) => key !== 'org-id')),
+ }))
+ .toSorted((a, b) => a.id - b.id);
});
async function loadQueueInfo() {
diff --git a/web/src/components/agent/AgentForm.vue b/web/src/components/agent/AgentForm.vue
new file mode 100644
index 000000000..d336774e5
--- /dev/null
+++ b/web/src/components/agent/AgentForm.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
diff --git a/web/src/components/agent/AgentList.vue b/web/src/components/agent/AgentList.vue
new file mode 100644
index 000000000..230e00e7f
--- /dev/null
+++ b/web/src/components/agent/AgentList.vue
@@ -0,0 +1,67 @@
+
+
+
+ {{ agent.name || `Agent ${agent.id}` }}
+
+
+
+
+
+
+
+ {{
+ agent.last_contact ? date.timeAgo(agent.last_contact * 1000) : $t('admin.settings.agents.never')
+ }}
+
+
+
+
+
+
{{ $t('admin.settings.agents.none') }}
+
+
+
+
+
+
+
diff --git a/web/src/components/agent/AgentManager.vue b/web/src/components/agent/AgentManager.vue
new file mode 100644
index 000000000..db7fa423f
--- /dev/null
+++ b/web/src/components/agent/AgentManager.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/components/form/KeyValueEditor.vue b/web/src/components/form/KeyValueEditor.vue
new file mode 100644
index 000000000..fee45ee22
--- /dev/null
+++ b/web/src/components/form/KeyValueEditor.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
diff --git a/web/src/components/layout/header/Navbar.vue b/web/src/components/layout/header/Navbar.vue
index f4092a1c7..59a869ba7 100644
--- a/web/src/components/layout/header/Navbar.vue
+++ b/web/src/components/layout/header/Navbar.vue
@@ -31,7 +31,7 @@
-
+
@@ -55,10 +55,6 @@ const authentication = useAuthentication();
const { user } = authentication;
const apiUrl = `${config.rootPath ?? ''}/swagger/index.html`;
-function doLogin() {
- authentication.authenticate(route.fullPath);
-}
-
const { enableSwagger } = config;
diff --git a/web/src/components/layout/popups/ManualPipelinePopup.vue b/web/src/components/layout/popups/ManualPipelinePopup.vue
deleted file mode 100644
index 4c7ba0e9c..000000000
--- a/web/src/components/layout/popups/ManualPipelinePopup.vue
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/web/src/components/org/settings/OrgAgentsTab.vue b/web/src/components/org/settings/OrgAgentsTab.vue
new file mode 100644
index 000000000..6eaec1c0b
--- /dev/null
+++ b/web/src/components/org/settings/OrgAgentsTab.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/web/src/components/repo/pipeline/PipelineLog.vue b/web/src/components/repo/pipeline/PipelineLog.vue
index f296c5eff..5fa128cb6 100644
--- a/web/src/components/repo/pipeline/PipelineLog.vue
+++ b/web/src/components/repo/pipeline/PipelineLog.vue
@@ -13,7 +13,7 @@
@@ -88,18 +88,19 @@
-
{{ step.error }}
-
{{ $t('repo.pipeline.actions.canceled') }}
-
{{ $t('repo.pipeline.step_not_started') }}
+
{{ $t('repo.pipeline.actions.canceled') }}
+
{{ $t('repo.pipeline.step_not_started') }}
{{ $t('repo.pipeline.loading') }}
+
{{ $t('repo.pipeline.no_logs') }}
-
{{ $t('repo.pipeline.exit_code', { exitCode: step.exit_code }) }}
+
{{ step.error }}
+
{{ $t('repo.pipeline.exit_code', { exitCode: step.exit_code }) }}
@@ -160,7 +161,7 @@ const loadedLogs = computed(() => !!log.value);
const hasLogs = computed(
() =>
// we do not have logs for skipped steps
- repo?.value && pipeline.value && step.value && step.value.state !== 'skipped' && step.value.state !== 'killed',
+ repo?.value && pipeline.value && step.value && step.value.state !== 'skipped',
);
const autoScroll = useStorage('log-auto-scroll', false);
const showActions = ref(false);
@@ -349,7 +350,7 @@ watch(stepSlug, async () => {
watch(step, async (newStep, oldStep) => {
if (oldStep?.name === newStep?.name) {
- if (oldStep?.end_time !== newStep?.end_time && autoScroll.value) {
+ if (oldStep?.finished !== newStep?.finished && autoScroll.value) {
scrollDown();
}
diff --git a/web/src/components/repo/pipeline/PipelineStepDuration.vue b/web/src/components/repo/pipeline/PipelineStepDuration.vue
index 8fd6e03d3..0b79a4bd1 100644
--- a/web/src/components/repo/pipeline/PipelineStepDuration.vue
+++ b/web/src/components/repo/pipeline/PipelineStepDuration.vue
@@ -19,8 +19,8 @@ const workflow = toRef(props, 'workflow');
const { durationAsNumber } = useDate();
const durationRaw = computed(() => {
- const start = (step.value ? step.value?.start_time : workflow.value?.start_time) || 0;
- const end = (step.value ? step.value?.end_time : workflow.value?.end_time) || 0;
+ const start = (step.value ? step.value?.started : workflow.value?.started) || 0;
+ const end = (step.value ? step.value?.finished : workflow.value?.finished) || 0;
if (end === 0 && start === 0) {
return undefined;
@@ -43,5 +43,5 @@ const duration = computed(() => {
return durationAsNumber(durationElapsed.value || 0);
});
-const started = computed(() => (step.value ? step.value?.start_time : workflow.value?.start_time) !== undefined);
+const started = computed(() => (step.value ? step.value?.started : workflow.value?.started) !== undefined);
diff --git a/web/src/components/repo/pipeline/PipelineStepList.vue b/web/src/components/repo/pipeline/PipelineStepList.vue
index 18e117a4c..50006de25 100644
--- a/web/src/components/repo/pipeline/PipelineStepList.vue
+++ b/web/src/components/repo/pipeline/PipelineStepList.vue
@@ -82,7 +82,7 @@
{{ workflow.name }}
diff --git a/web/src/components/repo/settings/CronTab.vue b/web/src/components/repo/settings/CronTab.vue
index 98d27cdef..e19c9f0a0 100644
--- a/web/src/components/repo/settings/CronTab.vue
+++ b/web/src/components/repo/settings/CronTab.vue
@@ -60,7 +60,7 @@
+
+
+
+
+
diff --git a/web/src/components/secrets/SecretEdit.vue b/web/src/components/secrets/SecretEdit.vue
index 81aca0963..18d79b5d7 100644
--- a/web/src/components/secrets/SecretEdit.vue
+++ b/web/src/components/secrets/SecretEdit.vue
@@ -21,8 +21,8 @@
/>
-
- {{ $t('secrets.images.desc') }}
+
+ {{ $t('secrets.plugins.desc') }}
diff --git a/web/src/components/user/UserAgentsTab.vue b/web/src/components/user/UserAgentsTab.vue
new file mode 100644
index 000000000..43ca05999
--- /dev/null
+++ b/web/src/components/user/UserAgentsTab.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/web/src/compositions/useAsyncAction.ts b/web/src/compositions/useAsyncAction.ts
index 663c080bf..09098e9bd 100644
--- a/web/src/compositions/useAsyncAction.ts
+++ b/web/src/compositions/useAsyncAction.ts
@@ -1,10 +1,9 @@
import { computed, ref } from 'vue';
-import useNotifications from '~/compositions/useNotifications';
-
-const notifications = useNotifications();
-
-export function useAsyncAction
(action: (...a: T) => void | Promise) {
+export function useAsyncAction(
+ action: (...a: T) => void | Promise,
+ onerror: ((error: any) => void) | undefined = undefined,
+) {
const isLoading = ref(false);
async function doSubmit(...a: T) {
@@ -16,7 +15,10 @@ export function useAsyncAction(action: (...a: T) => void |
try {
await action(...a);
} catch (error) {
- notifications.notify({ title: (error as Error).message, type: 'error' });
+ console.error(error);
+ if (onerror) {
+ onerror(error);
+ }
}
isLoading.value = false;
}
diff --git a/web/src/compositions/useAuthentication.ts b/web/src/compositions/useAuthentication.ts
index 35e6b510e..8ca3df563 100644
--- a/web/src/compositions/useAuthentication.ts
+++ b/web/src/compositions/useAuthentication.ts
@@ -12,6 +12,6 @@ export default () =>
const config = useUserConfig();
config.setUserConfig('redirectUrl', url);
}
- window.location.href = `${useConfig().rootPath}/authorize?forge_id=${forgeId}`;
+ window.location.href = `${useConfig().rootPath}/authorize?${forgeId !== undefined ? `forgeId=${forgeId}` : ''}`;
},
}) as const;
diff --git a/web/src/compositions/useDate.ts b/web/src/compositions/useDate.ts
index 50096b737..c467a244e 100644
--- a/web/src/compositions/useDate.ts
+++ b/web/src/compositions/useDate.ts
@@ -12,19 +12,24 @@ dayjs.extend(advancedFormat);
dayjs.extend(relativeTime);
dayjs.extend(duration);
+function toLocaleString(date: Date) {
+ return dayjs(date).format(useI18n().t('time.template'));
+}
+
+function timeAgo(date: Date | string | number) {
+ return dayjs().to(dayjs(date));
+}
+
+function prettyDuration(durationMs: number) {
+ return dayjs.duration(durationMs).humanize();
+}
+
+function durationAsNumber(durationMs: number): string {
+ const dur = dayjs.duration(durationMs);
+ return dur.format(dur.hours() > 1 ? 'HH:mm:ss' : 'mm:ss');
+}
+
export function useDate() {
- function toLocaleString(date: Date) {
- return dayjs(date).format(useI18n().t('time.template'));
- }
-
- function timeAgo(date: Date | string | number) {
- return dayjs().to(dayjs(date));
- }
-
- function prettyDuration(durationMs: number) {
- return dayjs.duration(durationMs).humanize();
- }
-
const addedLocales = ['en'];
async function setDayjsLocale(locale: string) {
@@ -36,11 +41,6 @@ export function useDate() {
}
}
- function durationAsNumber(durationMs: number): string {
- const dur = dayjs.duration(durationMs);
- return dur.format(dur.hours() > 1 ? 'HH:mm:ss' : 'mm:ss');
- }
-
return {
toLocaleString,
timeAgo,
diff --git a/web/src/compositions/usePaginate.test.ts b/web/src/compositions/usePaginate.test.ts
index c76303069..a9e303e59 100644
--- a/web/src/compositions/usePaginate.test.ts
+++ b/web/src/compositions/usePaginate.test.ts
@@ -18,11 +18,11 @@ async function waitForState(ref: Ref, expected: T): Promise {
});
}
-// TODO enable again with eslint-plugin-promise eslint-disable-next-line promise/prefer-await-to-callbacks
+// eslint-disable-next-line promise/prefer-await-to-callbacks
export const mountComposition = (cb: () => void) => {
const wrapper = shallowMount({
setup() {
- // TODO enable again with eslint-plugin-promise eslint-disable-next-line promise/prefer-await-to-callbacks
+ // eslint-disable-next-line promise/prefer-await-to-callbacks
cb();
return {};
},
diff --git a/web/src/compositions/usePipeline.ts b/web/src/compositions/usePipeline.ts
index d02409fdb..b4c8a6804 100644
--- a/web/src/compositions/usePipeline.ts
+++ b/web/src/compositions/usePipeline.ts
@@ -14,7 +14,7 @@ export default (pipeline: Ref) => {
return undefined;
}
- const start = pipeline.value.created_at || 0;
+ const start = pipeline.value.created || 0;
return start * 1000;
});
@@ -44,8 +44,8 @@ export default (pipeline: Ref) => {
return undefined;
}
- const start = pipeline.value.started_at || 0;
- const end = pipeline.value.finished_at || pipeline.value.updated_at || 0;
+ const start = pipeline.value.started || 0;
+ const end = pipeline.value.finished || pipeline.value.updated || 0;
if (start === 0 || end === 0) {
return 0;
@@ -109,7 +109,7 @@ export default (pipeline: Ref) => {
return undefined;
}
- const start = pipeline.value.created_at || 0;
+ const start = pipeline.value.created || 0;
return toLocaleString(new Date(start * 1000));
});
diff --git a/web/src/compositions/usePipelineFeed.ts b/web/src/compositions/usePipelineFeed.ts
index 65d3609a7..def2166f1 100644
--- a/web/src/compositions/usePipelineFeed.ts
+++ b/web/src/compositions/usePipelineFeed.ts
@@ -7,20 +7,20 @@ import useAuthentication from './useAuthentication';
const userConfig = useUserConfig();
+function toggle() {
+ userConfig.setUserConfig('isPipelineFeedOpen', !userConfig.userConfig.value.isPipelineFeedOpen);
+}
+
+function close() {
+ userConfig.setUserConfig('isPipelineFeedOpen', false);
+}
+
export default () => {
const pipelineStore = usePipelineStore();
const { isAuthenticated } = useAuthentication();
const isOpen = computed(() => userConfig.userConfig.value.isPipelineFeedOpen && !!isAuthenticated);
- function toggle() {
- userConfig.setUserConfig('isPipelineFeedOpen', !userConfig.userConfig.value.isPipelineFeedOpen);
- }
-
- function close() {
- userConfig.setUserConfig('isPipelineFeedOpen', false);
- }
-
const sortedPipelines = toRef(pipelineStore, 'pipelineFeed');
const activePipelines = toRef(pipelineStore, 'activePipelines');
diff --git a/web/src/lib/api/client.ts b/web/src/lib/api/client.ts
index 1fd5741fd..7270cbfe0 100644
--- a/web/src/lib/api/client.ts
+++ b/web/src/lib/api/client.ts
@@ -52,14 +52,19 @@ export default class ApiClient {
});
if (!res.ok) {
+ let message = res.statusText;
+ const resText = await res.text();
+ if (resText) {
+ message = `${res.statusText}: ${resText}`;
+ }
const error: ApiError = {
status: res.status,
- message: res.statusText,
+ message,
};
if (this.onerror) {
this.onerror(error);
}
- throw new Error(res.statusText);
+ throw new Error(message);
}
const contentType = res.headers.get('Content-Type');
@@ -96,7 +101,7 @@ export default class ApiClient {
const events = new EventSource(_path);
events.onmessage = (event) => {
const data = JSON.parse(event.data as string) as T;
- // TODO enable again with eslint-plugin-promise eslint-disable-next-line promise/prefer-await-to-callbacks
+ // eslint-disable-next-line promise/prefer-await-to-callbacks
callback(data);
};
diff --git a/web/src/lib/api/index.ts b/web/src/lib/api/index.ts
index de71c1353..a70741901 100644
--- a/web/src/lib/api/index.ts
+++ b/web/src/lib/api/index.ts
@@ -119,6 +119,10 @@ export default class WoodpeckerClient extends ApiClient {
return this._get(`/api/repos/${repoId}/pipelines/${pipelineNumber}/config`) as Promise;
}
+ async getPipelineMetadata(repoId: number, pipelineNumber: number): Promise {
+ return this._get(`/api/repos/${repoId}/pipelines/${pipelineNumber}/metadata`) as Promise;
+ }
+
async getPipelineFeed(): Promise {
return this._get(`/api/user/feed`) as Promise;
}
@@ -314,14 +318,31 @@ export default class WoodpeckerClient extends ApiClient {
return this._post('/api/agents', agent) as Promise;
}
- async updateAgent(agent: Partial): Promise {
- return this._patch(`/api/agents/${agent.id}`, agent);
+ async updateAgent(agent: Partial): Promise {
+ return this._patch(`/api/agents/${agent.id}`, agent) as Promise;
}
async deleteAgent(agent: Agent): Promise {
return this._delete(`/api/agents/${agent.id}`);
}
+ async getOrgAgents(orgId: number, opts?: PaginationOptions): Promise {
+ const query = encodeQueryString(opts);
+ return this._get(`/api/orgs/${orgId}/agents?${query}`) as Promise;
+ }
+
+ async createOrgAgent(orgId: number, agent: Partial): Promise {
+ return this._post(`/api/orgs/${orgId}/agents`, agent) as Promise;
+ }
+
+ async updateOrgAgent(orgId: number, agentId: number, agent: Partial): Promise {
+ return this._patch(`/api/orgs/${orgId}/agents/${agentId}`, agent) as Promise;
+ }
+
+ async deleteOrgAgent(orgId: number, agentId: number): Promise {
+ return this._delete(`/api/orgs/${orgId}/agents/${agentId}`);
+ }
+
async getForges(opts?: PaginationOptions): Promise {
const query = encodeQueryString(opts);
return this._get(`/api/forges?${query}`) as Promise;
@@ -398,7 +419,7 @@ export default class WoodpeckerClient extends ApiClient {
return this._post(`/api/repos/repair`);
}
- // TODO enable again with eslint-plugin-promise eslint-disable-next-line promise/prefer-await-to-callbacks
+ // eslint-disable-next-line promise/prefer-await-to-callbacks
on(callback: (data: { pipeline?: Pipeline; repo?: Repo }) => void): EventSource {
return this._subscribe('/api/stream/events', callback, {
reconnect: true,
@@ -409,7 +430,7 @@ export default class WoodpeckerClient extends ApiClient {
repoId: number,
pipeline: number,
step: number,
- // TODO enable again with eslint-plugin-promise eslint-disable-next-line promise/prefer-await-to-callbacks
+ // eslint-disable-next-line promise/prefer-await-to-callbacks
callback: (data: PipelineLog) => void,
): EventSource {
return this._subscribe(`/api/stream/logs/${repoId}/${pipeline}/${step}`, callback, {
diff --git a/web/src/lib/api/types/agent.ts b/web/src/lib/api/types/agent.ts
index ee5632e11..0afbf971f 100644
--- a/web/src/lib/api/types/agent.ts
+++ b/web/src/lib/api/types/agent.ts
@@ -1,6 +1,8 @@
export interface Agent {
id: number;
name: string;
+ owner_id: number;
+ org_id: number;
token: string;
created: number;
updated: number;
@@ -10,4 +12,5 @@ export interface Agent {
capacity: number;
version: string;
no_schedule: boolean;
+ custom_labels: Record;
}
diff --git a/web/src/lib/api/types/pipeline.ts b/web/src/lib/api/types/pipeline.ts
index 18b784e6d..2ca9ccf0d 100644
--- a/web/src/lib/api/types/pipeline.ts
+++ b/web/src/lib/api/types/pipeline.ts
@@ -25,16 +25,16 @@ export interface Pipeline {
errors?: PipelineError[];
// When the pipeline request was received.
- created_at: number;
+ created: number;
// When the pipeline was updated last time in database.
- updated_at: number;
+ updated: number;
// When the pipeline began execution.
- started_at: number;
+ started: number;
// When the pipeline was finished.
- finished_at: number;
+ finished: number;
// Where the deployment should go.
deploy_to: string;
@@ -76,13 +76,9 @@ export interface Pipeline {
// This url will point to the repository state associated with the pipeline's commit.
forge_url: string;
- signed: boolean;
-
- verified: boolean;
-
reviewed_by: string;
- reviewed_at: number;
+ reviewed: number;
// The steps associated with this pipeline.
// A pipeline will have multiple steps if a matrix pipeline was used or if a rebuild was requested.
@@ -110,8 +106,8 @@ export interface PipelineWorkflow {
name: string;
state: PipelineStatus;
environ?: Record;
- start_time?: number;
- end_time?: number;
+ started?: number;
+ finished?: number;
agent_id?: number;
error?: string;
children: PipelineStep[];
@@ -126,8 +122,8 @@ export interface PipelineStep {
name: string;
state: PipelineStatus;
exit_code: number;
- start_time?: number;
- end_time?: number;
+ started?: number;
+ finished?: number;
error?: string;
type?: StepType;
}
diff --git a/web/src/lib/api/types/queue.ts b/web/src/lib/api/types/queue.ts
index e8752c71d..221bbc0db 100644
--- a/web/src/lib/api/types/queue.ts
+++ b/web/src/lib/api/types/queue.ts
@@ -1,9 +1,8 @@
export interface Task {
id: number;
- data: string;
- labels: { [key: string]: string };
+ labels: Record;
dependencies: string[];
- dep_status: { [key: string]: string };
+ dep_status: Record;
run_on: string[];
agent_id: number;
}
diff --git a/web/src/lib/api/types/repo.ts b/web/src/lib/api/types/repo.ts
index a6b73576f..965d91d22 100644
--- a/web/src/lib/api/types/repo.ts
+++ b/web/src/lib/api/types/repo.ts
@@ -50,7 +50,7 @@ export interface Repo {
// Whether the repository has trusted access for pipelines.
// If the repository is trusted then the host network can be used and
// volumes can be created.
- trusted: boolean;
+ trusted: RepoTrusted;
// x-dart-type: Duration
// The amount of time in minutes before the pipeline is killed.
@@ -102,3 +102,9 @@ export interface RepoPermissions {
admin: boolean;
synced: number;
}
+
+export interface RepoTrusted {
+ network: boolean;
+ volumes: boolean;
+ security: boolean;
+}
diff --git a/web/src/router.ts b/web/src/router.ts
index cb00abc46..ad807561b 100644
--- a/web/src/router.ts
+++ b/web/src/router.ts
@@ -94,6 +94,11 @@ const routes: RouteRecordRaw[] = [
component: (): Component => import('~/views/repo/pipeline/PipelineErrors.vue'),
props: true,
},
+ {
+ path: 'debug',
+ name: 'repo-pipeline-debug',
+ component: (): Component => import('~/views/repo/pipeline/PipelineDebug.vue'),
+ },
],
},
{
@@ -103,11 +108,17 @@ const routes: RouteRecordRaw[] = [
meta: { authentication: 'required' },
props: true,
},
+ {
+ path: 'manual',
+ name: 'repo-manual',
+ component: (): Component => import('~/views/repo/RepoManualPipeline.vue'),
+ meta: { authentication: 'required', repoHeader: true },
+ },
],
},
{
path: ':repoOwner/:repoName/:pathMatch(.*)*',
- component: async () => import('~/views/repo/RepoDeprecatedRedirect.vue'),
+ component: (): Component => import('~/views/repo/RepoDeprecatedRedirect.vue'),
props: true,
},
],
@@ -161,7 +172,7 @@ const routes: RouteRecordRaw[] = [
},
{
path: `${rootPath}/cli/auth`,
- component: async () => import('~/views/cli/Auth.vue'),
+ component: (): Component => import('~/views/cli/Auth.vue'),
meta: { authentication: 'required' },
},
@@ -172,7 +183,7 @@ const routes: RouteRecordRaw[] = [
},
{
path: `${rootPath}/:repoOwner/:repoName/:pathMatch(.*)*`,
- component: async () => import('~/views/repo/RepoDeprecatedRedirect.vue'),
+ component: (): Component => import('~/views/repo/RepoDeprecatedRedirect.vue'),
props: true,
},
diff --git a/web/src/utils/helpers.ts b/web/src/utils/helpers.ts
index ecd2b47f2..2efb9818b 100644
--- a/web/src/utils/helpers.ts
+++ b/web/src/utils/helpers.ts
@@ -46,7 +46,7 @@ export function isStepRunning(step: PipelineStep): boolean {
* @returns {number} 0 if created at the same time, < 0 if b was create before a, > 0 otherwise
*/
export function comparePipelines(a: Pipeline, b: Pipeline): number {
- return (b.created_at || -1) - (a.created_at || -1);
+ return (b.created || -1) - (a.created || -1);
}
/**
diff --git a/web/src/views/RepoAdd.vue b/web/src/views/RepoAdd.vue
index 1730aef07..5a217f6e9 100644
--- a/web/src/views/RepoAdd.vue
+++ b/web/src/views/RepoAdd.vue
@@ -38,6 +38,7 @@ import { useRouter } from 'vue-router';
import Badge from '~/components/atomic/Badge.vue';
import Button from '~/components/atomic/Button.vue';
+import Icon from '~/components/atomic/Icon.vue';
import ListItem from '~/components/atomic/ListItem.vue';
import Scaffold from '~/components/layout/scaffold/Scaffold.vue';
import useApiClient from '~/compositions/useApiClient';
diff --git a/web/src/views/User.vue b/web/src/views/User.vue
index 1c58d87e5..b19639618 100644
--- a/web/src/views/User.vue
+++ b/web/src/views/User.vue
@@ -14,6 +14,9 @@
+
+
+
@@ -21,6 +24,7 @@
import Button from '~/components/atomic/Button.vue';
import Scaffold from '~/components/layout/scaffold/Scaffold.vue';
import Tab from '~/components/layout/scaffold/Tab.vue';
+import UserAgentsTab from '~/components/user/UserAgentsTab.vue';
import UserCLIAndAPITab from '~/components/user/UserCLIAndAPITab.vue';
import UserGeneralTab from '~/components/user/UserGeneralTab.vue';
import UserRegistriesTab from '~/components/user/UserRegistriesTab.vue';
diff --git a/web/src/views/org/OrgSettings.vue b/web/src/views/org/OrgSettings.vue
index 1fbb4052f..25d2e92e0 100644
--- a/web/src/views/org/OrgSettings.vue
+++ b/web/src/views/org/OrgSettings.vue
@@ -18,6 +18,10 @@
+
+
+
+
@@ -26,7 +30,9 @@ import { onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
+import Scaffold from '~/components/layout/scaffold/Scaffold.vue';
import Tab from '~/components/layout/scaffold/Tab.vue';
+import OrgAgentsTab from '~/components/org/settings/OrgAgentsTab.vue';
import OrgRegistriesTab from '~/components/org/settings/OrgRegistriesTab.vue';
import OrgSecretsTab from '~/components/org/settings/OrgSecretsTab.vue';
import { inject } from '~/compositions/useInjectProvide';
diff --git a/web/src/views/org/OrgWrapper.vue b/web/src/views/org/OrgWrapper.vue
index df09d8769..ffbc9b30a 100644
--- a/web/src/views/org/OrgWrapper.vue
+++ b/web/src/views/org/OrgWrapper.vue
@@ -1,5 +1,5 @@
-
+
{{ org.name }}
@@ -20,6 +20,7 @@
diff --git a/web/src/views/repo/RepoWrapper.vue b/web/src/views/repo/RepoWrapper.vue
index 123a788ee..9bc951250 100644
--- a/web/src/views/repo/RepoWrapper.vue
+++ b/web/src/views/repo/RepoWrapper.vue
@@ -1,7 +1,7 @@
@@ -30,11 +30,17 @@
+
-
@@ -54,7 +60,6 @@ import { useRoute, useRouter } from 'vue-router';
import Button from '~/components/atomic/Button.vue';
import type { IconNames } from '~/components/atomic/Icon.vue';
import IconButton from '~/components/atomic/IconButton.vue';
-import ManualPipelinePopup from '~/components/layout/popups/ManualPipelinePopup.vue';
import Scaffold from '~/components/layout/scaffold/Scaffold.vue';
import Tab from '~/components/layout/scaffold/Tab.vue';
import useApiClient from '~/compositions/useApiClient';
@@ -97,8 +102,6 @@ const forgeIcon = computed(() => {
return 'repo';
});
-const showManualPipelinePopup = ref(false);
-
async function loadRepo() {
repoPermissions.value = await apiClient.getRepoPermissions(repositoryId.value);
if (!repoPermissions.value.pull) {
diff --git a/web/src/views/repo/pipeline/Pipeline.vue b/web/src/views/repo/pipeline/Pipeline.vue
index f1fe10961..c7e734a3e 100644
--- a/web/src/views/repo/pipeline/Pipeline.vue
+++ b/web/src/views/repo/pipeline/Pipeline.vue
@@ -8,17 +8,7 @@
/>
-
-
-
-
- {{ $t('repo.pipeline.we_got_some_errors') }}
- {{ selectedStep?.error }}
-
-
-
-
-
+
@@ -86,7 +76,6 @@ import useApiClient from '~/compositions/useApiClient';
import { useAsyncAction } from '~/compositions/useAsyncAction';
import useNotifications from '~/compositions/useNotifications';
import type { Pipeline, PipelineStep, Repo, RepoPermissions } from '~/lib/api/types';
-import { findStep } from '~/utils/helpers';
const props = defineProps<{
stepId?: string | null;
@@ -148,8 +137,6 @@ const selectedStepId = computed({
},
});
-const selectedStep = computed(() => findStep(pipeline.value.workflows || [], selectedStepId.value || -1));
-
const { doSubmit: approvePipeline, isLoading: isApprovingPipeline } = useAsyncAction(async () => {
if (!repo) {
throw new Error('Unexpected: Repo is undefined');
diff --git a/web/src/views/repo/pipeline/PipelineDebug.vue b/web/src/views/repo/pipeline/PipelineDebug.vue
new file mode 100644
index 000000000..58fcfdae5
--- /dev/null
+++ b/web/src/views/repo/pipeline/PipelineDebug.vue
@@ -0,0 +1,77 @@
+
+
+
+
+ {{ $t('repo.pipeline.debug.metadata_exec_desc') }}
+ {{ cliExecWithMetadata }}
+
+
+
+
+
+
+
+
+
{{ $t('repo.pipeline.debug.no_permission') }}
+
+
+
+
+
diff --git a/web/src/views/repo/pipeline/PipelineWrapper.vue b/web/src/views/repo/pipeline/PipelineWrapper.vue
index 6b7f3d2ac..5cbf6f7b2 100644
--- a/web/src/views/repo/pipeline/PipelineWrapper.vue
+++ b/web/src/views/repo/pipeline/PipelineWrapper.vue
@@ -1,7 +1,7 @@
-
+
+
@@ -219,6 +220,10 @@ const activeTab = computed({
return 'errors';
}
+ if (route.name === 'repo-pipeline-debug' && repoPermissions.value?.push) {
+ return 'debug';
+ }
+
return 'tasks';
},
set(tab: string) {
@@ -237,6 +242,10 @@ const activeTab = computed({
if (tab === 'errors') {
router.replace({ name: 'repo-pipeline-errors' });
}
+
+ if (tab === 'debug' && repoPermissions.value?.push) {
+ router.replace({ name: 'repo-pipeline-debug' });
+ }
},
});
diff --git a/web/vite.config.ts b/web/vite.config.ts
index 07c6fd936..45fe7ba40 100644
--- a/web/vite.config.ts
+++ b/web/vite.config.ts
@@ -18,7 +18,6 @@ function woodpeckerInfoPlugin(): Plugin {
'1) Please add `WOODPECKER_DEV_WWW_PROXY=http://localhost:8010` to your `.env` file.\n' +
'After starting the woodpecker server as well you should now be able to access the UI at http://localhost:8000/\n\n' +
'2) If you want to run the vite dev server (`pnpm start`) within a container please set `VITE_DEV_SERVER_HOST=0.0.0.0`.';
- // eslint-disable-next-line no-console
console.log(info);
},
};
@@ -78,7 +77,7 @@ export default defineConfig({
copyFile(
`node_modules/dayjs/esm/locale/${langName}.js`,
`src/assets/dayjsLocales/${name}.js`,
- // TODO enable with eslint-plugin-promise eslint-disable-next-line promise/prefer-await-to-callbacks
+ // eslint-disable-next-line promise/prefer-await-to-callbacks
(err) => {
if (err) {
throw err;
diff --git a/woodpecker-go/woodpecker/agent_test.go b/woodpecker-go/woodpecker/agent_test.go
index d424336d8..a10d756ee 100644
--- a/woodpecker-go/woodpecker/agent_test.go
+++ b/woodpecker-go/woodpecker/agent_test.go
@@ -431,16 +431,14 @@ func TestClient_AgentTasksList(t *testing.T) {
agentID: 1,
expected: []*Task{
{
- ID: "4696",
- Data: []byte{},
+ ID: "4696",
Labels: map[string]string{
"platform": "linux/amd64",
"repo": "woodpecker-ci/woodpecker",
},
},
{
- ID: "4697",
- Data: []byte{},
+ ID: "4697",
Labels: map[string]string{
"platform": "linux/arm64",
"repo": "woodpecker-ci/woodpecker",
diff --git a/woodpecker-go/woodpecker/interface.go b/woodpecker-go/woodpecker/interface.go
index 3eb54a2b6..95ff60859 100644
--- a/woodpecker-go/woodpecker/interface.go
+++ b/woodpecker-go/woodpecker/interface.go
@@ -110,6 +110,9 @@ type Client interface {
// PipelineKill force kills the running pipeline.
PipelineKill(repoID, pipeline int64) error
+ // PipelineMetadata returns metadata for a pipeline.
+ PipelineMetadata(repoID int64, pipelineNumber int) ([]byte, error)
+
// StepLogEntries returns the LogEntries for the given pipeline step
StepLogEntries(repoID, pipeline, stepID int64) ([]*LogEntry, error)
diff --git a/woodpecker-go/woodpecker/mocks/client.go b/woodpecker-go/woodpecker/mocks/client.go
index 0d23709dd..4e670aa92 100644
--- a/woodpecker-go/woodpecker/mocks/client.go
+++ b/woodpecker-go/woodpecker/mocks/client.go
@@ -1211,6 +1211,36 @@ func (_m *Client) PipelineList(repoID int64) ([]*woodpecker.Pipeline, error) {
return r0, r1
}
+// PipelineMetadata provides a mock function with given fields: repoID, pipelineNumber
+func (_m *Client) PipelineMetadata(repoID int64, pipelineNumber int) ([]byte, error) {
+ ret := _m.Called(repoID, pipelineNumber)
+
+ if len(ret) == 0 {
+ panic("no return value specified for PipelineMetadata")
+ }
+
+ var r0 []byte
+ var r1 error
+ if rf, ok := ret.Get(0).(func(int64, int) ([]byte, error)); ok {
+ return rf(repoID, pipelineNumber)
+ }
+ if rf, ok := ret.Get(0).(func(int64, int) []byte); ok {
+ r0 = rf(repoID, pipelineNumber)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).([]byte)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(int64, int) error); ok {
+ r1 = rf(repoID, pipelineNumber)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
// PipelineQueue provides a mock function with given fields:
func (_m *Client) PipelineQueue() ([]*woodpecker.Feed, error) {
ret := _m.Called()
diff --git a/woodpecker-go/woodpecker/pipeline.go b/woodpecker-go/woodpecker/pipeline.go
index 8ed4d6d20..4eec3ef01 100644
--- a/woodpecker-go/woodpecker/pipeline.go
+++ b/woodpecker-go/woodpecker/pipeline.go
@@ -1,8 +1,15 @@
package woodpecker
-import "fmt"
+import (
+ "fmt"
+ "io"
+ "net/http"
+)
-const pathPipelineQueue = "%s/api/pipelines"
+const (
+ pathPipelineQueue = "%s/api/pipelines"
+ pathPipelineMetadata = "%s/api/repos/%d/pipelines/%d/metadata"
+)
// PipelineQueue returns a list of enqueued pipelines.
func (c *client) PipelineQueue() ([]*Feed, error) {
@@ -11,3 +18,16 @@ func (c *client) PipelineQueue() ([]*Feed, error) {
err := c.get(uri, &out)
return out, err
}
+
+// PipelineMetadata returns metadata for a pipeline, workflow name is optional.
+func (c *client) PipelineMetadata(repoID int64, pipelineNumber int) ([]byte, error) {
+ uri := fmt.Sprintf(pathPipelineMetadata, c.addr, repoID, pipelineNumber)
+
+ body, err := c.open(uri, http.MethodGet, nil)
+ if err != nil {
+ return nil, err
+ }
+ defer body.Close()
+
+ return io.ReadAll(body)
+}
diff --git a/woodpecker-go/woodpecker/queue_test.go b/woodpecker-go/woodpecker/queue_test.go
index 099169d3a..11ab1b8a8 100644
--- a/woodpecker-go/woodpecker/queue_test.go
+++ b/woodpecker-go/woodpecker/queue_test.go
@@ -49,8 +49,7 @@ func TestClient_QueueInfo(t *testing.T) {
expected: &Info{
Running: []Task{
{
- ID: "4696",
- Data: []byte{},
+ ID: "4696",
Labels: map[string]string{
"platform": "linux/amd64",
"repo": "woodpecker-ci/woodpecker",
diff --git a/woodpecker-go/woodpecker/types.go b/woodpecker-go/woodpecker/types.go
index b9622ddb6..aa30137f0 100644
--- a/woodpecker-go/woodpecker/types.go
+++ b/woodpecker-go/woodpecker/types.go
@@ -69,35 +69,32 @@ type (
// Pipeline defines a pipeline object.
Pipeline struct {
- ID int64 `json:"id"`
- Number int64 `json:"number"`
- Parent int64 `json:"parent"`
- Event string `json:"event"`
- Status string `json:"status"`
- Errors []*PipelineError `json:"errors"`
- // Deprecated TODO remove in 3.x
- Enqueued int64 `json:"enqueued_at"`
- Created int64 `json:"created_at"`
- Updated int64 `json:"updated_at"`
- Started int64 `json:"started_at"`
- Finished int64 `json:"finished_at"`
- Deploy string `json:"deploy_to"`
- Commit string `json:"commit"`
- Branch string `json:"branch"`
- Ref string `json:"ref"`
- Refspec string `json:"refspec"`
- CloneURL string `json:"clone_url"`
- Title string `json:"title"`
- Message string `json:"message"`
- Timestamp int64 `json:"timestamp"`
- Sender string `json:"sender"`
- Author string `json:"author"`
- Avatar string `json:"author_avatar"`
- Email string `json:"author_email"`
- ForgeURL string `json:"forge_url"`
- Reviewer string `json:"reviewed_by"`
- Reviewed int64 `json:"reviewed_at"`
- Workflows []*Workflow `json:"workflows,omitempty"`
+ ID int64 `json:"id"`
+ Number int64 `json:"number"`
+ Parent int64 `json:"parent"`
+ Event string `json:"event"`
+ Status string `json:"status"`
+ Errors []*PipelineError `json:"errors"`
+ Created int64 `json:"created_at"`
+ Updated int64 `json:"updated_at"`
+ Started int64 `json:"started_at"`
+ Finished int64 `json:"finished_at"`
+ Deploy string `json:"deploy_to"`
+ Commit string `json:"commit"`
+ Branch string `json:"branch"`
+ Ref string `json:"ref"`
+ Refspec string `json:"refspec"`
+ Title string `json:"title"`
+ Message string `json:"message"`
+ Timestamp int64 `json:"timestamp"`
+ Sender string `json:"sender"`
+ Author string `json:"author"`
+ Avatar string `json:"author_avatar"`
+ Email string `json:"author_email"`
+ ForgeURL string `json:"forge_url"`
+ Reviewer string `json:"reviewed_by"`
+ Reviewed int64 `json:"reviewed_at"`
+ Workflows []*Workflow `json:"workflows,omitempty"`
}
// Workflow represents a workflow in the pipeline.
@@ -137,10 +134,6 @@ type (
Address string `json:"address"`
Username string `json:"username"`
Password string `json:"password,omitempty"`
- // Deprecated
- Email string `json:"email"` // TODO: remove in 3.x
- // Deprecated
- Token string `json:"token"` // TODO: remove in 3.x
}
// Secret represents a secret variable, such as a password or token.
@@ -161,9 +154,9 @@ type (
Number int64 `json:"number,omitempty"`
Event string `json:"event,omitempty"`
Status string `json:"status,omitempty"`
- Created int64 `json:"created_at,omitempty"`
- Started int64 `json:"started_at,omitempty"`
- Finished int64 `json:"finished_at,omitempty"`
+ Created int64 `json:"created,omitempty"`
+ Started int64 `json:"started,omitempty"`
+ Finished int64 `json:"finished,omitempty"`
Commit string `json:"commit,omitempty"`
Branch string `json:"branch,omitempty"`
Ref string `json:"ref,omitempty"`
@@ -183,31 +176,21 @@ type (
Commit string `json:"commit,omitempty"`
}
- //nolint:godot
- // TODO: use dedicated struct in 3.x
- // QueueStats struct {
- // Workers int `json:"worker_count"`
- // Pending int `json:"pending_count"`
- // WaitingOnDeps int `json:"waiting_on_deps_count"`
- // Running int `json:"running_count"`
- // Complete int `json:"completed_count"`
- // }
+ QueueStats struct {
+ Workers int `json:"worker_count"`
+ Pending int `json:"pending_count"`
+ WaitingOnDeps int `json:"waiting_on_deps_count"`
+ Running int `json:"running_count"`
+ Complete int `json:"completed_count"`
+ }
// Info provides queue stats.
Info struct {
- Pending []Task `json:"pending"`
- WaitingOnDeps []Task `json:"waiting_on_deps"`
- Running []Task `json:"running"`
- // TODO: use dedicated struct in 3.x
- // Stats QueueStats `json:"stats"`
- Stats struct {
- Workers int `json:"worker_count"`
- Pending int `json:"pending_count"`
- WaitingOnDeps int `json:"waiting_on_deps_count"`
- Running int `json:"running_count"`
- Complete int `json:"completed_count"`
- } `json:"stats"`
- Paused bool `json:"paused,omitempty"`
+ Pending []Task `json:"pending"`
+ WaitingOnDeps []Task `json:"waiting_on_deps"`
+ Running []Task `json:"running"`
+ Stats QueueStats `json:"stats"`
+ Paused bool `json:"paused,omitempty"`
}
// LogLevel is for checking/setting logging level.
@@ -233,7 +216,7 @@ type (
CreatorID int64 `json:"creator_id"`
NextExec int64 `json:"next_exec"`
Schedule string `json:"schedule"`
- Created int64 `json:"created_at"`
+ Created int64 `json:"created"`
Branch string `json:"branch"`
}
@@ -245,25 +228,26 @@ type (
// Agent is the JSON data for an agent.
Agent struct {
- ID int64 `json:"id"`
- Created int64 `json:"created"`
- Updated int64 `json:"updated"`
- Name string `json:"name"`
- OwnerID int64 `json:"owner_id"`
- Token string `json:"token"`
- LastContact int64 `json:"last_contact"`
- LastWork int64 `json:"last_work"`
- Platform string `json:"platform"`
- Backend string `json:"backend"`
- Capacity int32 `json:"capacity"`
- Version string `json:"version"`
- NoSchedule bool `json:"no_schedule"`
+ ID int64 `json:"id"`
+ Created int64 `json:"created"`
+ Updated int64 `json:"updated"`
+ Name string `json:"name"`
+ OwnerID int64 `json:"owner_id"`
+ OrgID int64 `json:"org_id"`
+ Token string `json:"token"`
+ LastContact int64 `json:"last_contact"`
+ LastWork int64 `json:"last_work"`
+ Platform string `json:"platform"`
+ Backend string `json:"backend"`
+ Capacity int32 `json:"capacity"`
+ Version string `json:"version"`
+ NoSchedule bool `json:"no_schedule"`
+ CustomLabels map[string]string `json:"custom_labels"`
}
// Task is the JSON data for a task.
Task struct {
ID string `json:"id"`
- Data []byte `json:"data"`
Labels map[string]string `json:"labels"`
Dependencies []string `json:"dependencies"`
RunOn []string `json:"run_on"`