diff --git a/.cspell.json b/.cspell.json index 107c9e082..30b77e051 100644 --- a/.cspell.json +++ b/.cspell.json @@ -90,7 +90,11 @@ "binutils", "nocolor", "logfile", - "Keyfunc" + "Keyfunc", + "protoc", + "PROTOC", + "GOBIN", + "GOPATH" ], "ignorePaths": [ "**/node_modules/**/*", diff --git a/.mockery.yaml b/.mockery.yaml new file mode 100644 index 000000000..cc734bcae --- /dev/null +++ b/.mockery.yaml @@ -0,0 +1,2 @@ +--- +disable-version-string: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 088f65d38..fa3427fe3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -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.12.1-beta + rev: v2.12.0 hooks: - id: hadolint - repo: https://github.com/pre-commit/mirrors-prettier diff --git a/.woodpecker/binaries.yaml b/.woodpecker/binaries.yaml index 2109c4840..3a43d3609 100644 --- a/.woodpecker/binaries.yaml +++ b/.woodpecker/binaries.yaml @@ -90,11 +90,10 @@ steps: release: depends_on: - checksums - image: docker.io/plugins/github-release - secrets: - - source: github_token - target: github_release_api_key + image: woodpeckerci/plugin-github-release:1.1.2 settings: + api_key: + from_secret: github_token files: - dist/*.tar.gz - dist/*.deb diff --git a/Makefile b/Makefile index c0029f25b..e4a33838f 100644 --- a/Makefile +++ b/Makefile @@ -58,8 +58,6 @@ ifeq (in_docker,$(firstword $(MAKECMDGOALS))) -e TARGETOS="$(TARGETOS)" \ -e TARGETARCH="$(TARGETARCH)" \ -e CGO_ENABLED="$(CGO_ENABLED)" \ - -e GOPATH=/tmp/go \ - -e HOME=/tmp/home \ -v $(PWD):/build --rm woodpecker/make:local make $(MAKE_ARGS) else @@ -110,7 +108,7 @@ clean-all: clean ## Clean all artifacts rm -rf docs/docs/40-cli.md docs/swagger.json .PHONY: generate -generate: generate-swagger ## Run all code generations +generate: install-tools generate-swagger ## Run all code generations go generate ./... generate-swagger: install-tools ## Run swagger code generation @@ -137,6 +135,15 @@ install-tools: ## Install development tools fi ; \ hash addlicense > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ go install github.com/google/addlicense@latest; \ + fi ; \ + hash mockery > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + go install github.com/vektra/mockery/v2@latest; \ + fi ; \ + hash protoc-gen-go > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + go install google.golang.org/protobuf/cmd/protoc-gen-go@latest; \ + fi ; \ + hash protoc-gen-go-grpc > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest; \ fi ui-dependencies: ## Install UI dependencies diff --git a/cli/common/hooks.go b/cli/common/hooks.go index 5febcfa13..952742cba 100644 --- a/cli/common/hooks.go +++ b/cli/common/hooks.go @@ -57,7 +57,7 @@ func After(_ *cli.Context) error { if waitForUpdateCheck != nil { select { case <-waitForUpdateCheck.Done(): - // When the actual command already finished, we still wait 250ms for the update check to finish + // When the actual command already finished, we still wait 500ms for the update check to finish case <-time.After(time.Millisecond * 500): log.Debug().Msg("Update check stopped due to timeout") cancelWaitForUpdate(errors.New("update check timeout")) diff --git a/cli/internal/config/config.go b/cli/internal/config/config.go index 77405dc66..50d32bec0 100644 --- a/cli/internal/config/config.go +++ b/cli/internal/config/config.go @@ -30,9 +30,12 @@ func Load(c *cli.Context) error { return err } - if config == nil && !c.IsSet("server-url") && !c.IsSet("token") { - log.Info().Msg("The woodpecker-cli is not yet set up. Please run `woodpecker-cli setup`") - return errors.New("woodpecker-cli is not setup") + if config == nil { + config = &Config{ + LogLevel: "info", + ServerURL: c.String("server-url"), + Token: c.String("token"), + } } if !c.IsSet("server") { @@ -56,6 +59,11 @@ func Load(c *cli.Context) error { } } + if config.ServerURL == "" || config.Token == "" { + log.Info().Msg("The woodpecker-cli is not yet set up. Please run `woodpecker-cli setup` or provide the required environment variables / flags.") + return errors.New("woodpecker-cli is not configured") + } + return nil } diff --git a/cmd/server/docs/docs.go b/cmd/server/docs/docs.go index 51cfe5587..1195f9829 100644 --- a/cmd/server/docs/docs.go +++ b/cmd/server/docs/docs.go @@ -3891,6 +3891,9 @@ const docTemplate = `{ "Org": { "type": "object", "properties": { + "forge_id": { + "type": "integer" + }, "id": { "type": "integer" }, @@ -4122,6 +4125,9 @@ const docTemplate = `{ "default_branch": { "type": "string" }, + "forge_id": { + "type": "integer" + }, "forge_remote_id": { "description": "ForgeRemoteID is the unique identifier for the repository on the forge.", "type": "string" @@ -4418,6 +4424,9 @@ const docTemplate = `{ "description": "Email is the email address for this user.\n\nrequired: true", "type": "string" }, + "forge_id": { + "type": "integer" + }, "id": { "description": "the id for this user.\n\nrequired: true", "type": "integer" diff --git a/cmd/server/flags.go b/cmd/server/flags.go index 11d7ff2f3..9789a8089 100644 --- a/cmd/server/flags.go +++ b/cmd/server/flags.go @@ -246,11 +246,6 @@ var flags = append([]cli.Flag{ Usage: "Disable version check in admin web ui.", Name: "skip-version-check", }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_ADDON_FORGE"}, - Name: "addon-forge", - Usage: "forge addon", - }, // // backend options for pipeline compiler // @@ -309,6 +304,35 @@ var flags = append([]cli.Flag{ Usage: "set the cpus allowed to execute containers", }, // + &cli.StringFlag{ + Name: "forge-url", + Usage: "url of the forge", + EnvVars: []string{"WOODPECKER_FORGE_URL", "WOODPECKER_GITHUB_URL", "WOODPECKER_GITLAB_URL", "WOODPECKER_GITEA_URL", "WOODPECKER_BITBUCKET_URL"}, + }, + &cli.StringFlag{ + Name: "forge-oauth-client", + Usage: "oauth2 client id", + EnvVars: []string{"WOODPECKER_FORGE_CLIENT", "WOODPECKER_GITHUB_CLIENT", "WOODPECKER_GITLAB_CLIENT", "WOODPECKER_GITEA_CLIENT", "WOODPECKER_BITBUCKET_CLIENT", "WOODPECKER_BITBUCKET_DC_CLIENT_ID"}, + }, + &cli.StringFlag{ + Name: "forge-oauth-secret", + Usage: "oauth2 client secret", + EnvVars: []string{"WOODPECKER_FORGE_SECRET", "WOODPECKER_GITHUB_SECRET", "WOODPECKER_GITLAB_SECRET", "WOODPECKER_GITEA_SECRET", "WOODPECKER_BITBUCKET_SECRET", "WOODPECKER_BITBUCKET_DC_CLIENT_SECRET"}, + }, + &cli.BoolFlag{ + Name: "forge-skip-verify", + Usage: "skip ssl verification", + EnvVars: []string{"WOODPECKER_FORGE_SKIP_VERIFY", "WOODPECKER_GITHUB_SKIP_VERIFY", "WOODPECKER_GITLAB_SKIP_VERIFY", "WOODPECKER_GITEA_SKIP_VERIFY", "WOODPECKER_BITBUCKET_SKIP_VERIFY"}, + }, + // + // Addon + // + &cli.StringFlag{ + EnvVars: []string{"WOODPECKER_ADDON_FORGE"}, + Name: "addon-forge", + Usage: "path to forge addon executable", + }, + // // GitHub // &cli.BoolFlag{ @@ -316,24 +340,6 @@ var flags = append([]cli.Flag{ Name: "github", Usage: "github driver is enabled", }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_GITHUB_URL"}, - Name: "github-server", - Usage: "github server address", - Value: "https://github.com", - }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_GITHUB_CLIENT"}, - Name: "github-client", - Usage: "github oauth2 client id", - FilePath: os.Getenv("WOODPECKER_GITHUB_CLIENT_FILE"), - }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_GITHUB_SECRET"}, - Name: "github-secret", - Usage: "github oauth2 client secret", - FilePath: os.Getenv("WOODPECKER_GITHUB_SECRET_FILE"), - }, &cli.BoolFlag{ EnvVars: []string{"WOODPECKER_GITHUB_MERGE_REF"}, Name: "github-merge-ref", @@ -346,11 +352,6 @@ var flags = append([]cli.Flag{ Usage: "github tokens should only get access to public repos", Value: false, }, - &cli.BoolFlag{ - EnvVars: []string{"WOODPECKER_GITHUB_SKIP_VERIFY"}, - Name: "github-skip-verify", - Usage: "github skip ssl verification", - }, // // Gitea // @@ -359,29 +360,6 @@ var flags = append([]cli.Flag{ Name: "gitea", Usage: "gitea driver is enabled", }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_GITEA_URL"}, - Name: "gitea-server", - Usage: "gitea server address", - Value: "https://try.gitea.io", - }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_GITEA_CLIENT"}, - Name: "gitea-client", - Usage: "gitea oauth2 client id", - FilePath: os.Getenv("WOODPECKER_GITEA_CLIENT_FILE"), - }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_GITEA_SECRET"}, - Name: "gitea-secret", - Usage: "gitea oauth2 client secret", - FilePath: os.Getenv("WOODPECKER_GITEA_SECRET_FILE"), - }, - &cli.BoolFlag{ - EnvVars: []string{"WOODPECKER_GITEA_SKIP_VERIFY"}, - Name: "gitea-skip-verify", - Usage: "gitea skip ssl verification", - }, &cli.StringFlag{ EnvVars: []string{"WOODPECKER_DEV_GITEA_OAUTH_URL"}, Name: "gitea-oauth-server", @@ -395,18 +373,6 @@ var flags = append([]cli.Flag{ Name: "bitbucket", Usage: "bitbucket driver is enabled", }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_BITBUCKET_CLIENT"}, - Name: "bitbucket-client", - Usage: "bitbucket oauth2 client id", - FilePath: os.Getenv("WOODPECKER_BITBUCKET_CLIENT_FILE"), - }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_BITBUCKET_SECRET"}, - Name: "bitbucket-secret", - Usage: "bitbucket oauth2 client secret", - FilePath: os.Getenv("WOODPECKER_BITBUCKET_SECRET_FILE"), - }, // // Gitlab // @@ -415,29 +381,6 @@ var flags = append([]cli.Flag{ Name: "gitlab", Usage: "gitlab driver is enabled", }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_GITLAB_URL"}, - Name: "gitlab-server", - Usage: "gitlab server address", - Value: "https://gitlab.com", - }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_GITLAB_CLIENT"}, - Name: "gitlab-client", - Usage: "gitlab oauth2 client id", - FilePath: os.Getenv("WOODPECKER_GITLAB_CLIENT_FILE"), - }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_GITLAB_SECRET"}, - Name: "gitlab-secret", - Usage: "gitlab oauth2 client secret", - FilePath: os.Getenv("WOODPECKER_GITLAB_SECRET_FILE"), - }, - &cli.BoolFlag{ - EnvVars: []string{"WOODPECKER_GITLAB_SKIP_VERIFY"}, - Name: "gitlab-skip-verify", - Usage: "gitlab skip ssl verification", - }, // // Bitbucket DataCenter/Server (previously Stash) // @@ -446,23 +389,6 @@ var flags = append([]cli.Flag{ Name: "bitbucket-dc", Usage: "Bitbucket DataCenter/Server driver is enabled", }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_BITBUCKET_DC_URL"}, - Name: "bitbucket-dc-server", - Usage: "Bitbucket DataCenter/Server server address", - }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_BITBUCKET_DC_CLIENT_ID"}, - Name: "bitbucket-dc-client-id", - Usage: "Bitbucket DataCenter/Server OAuth 2.0 client id", - FilePath: os.Getenv("WOODPECKER_BITBUCKET_DC_CLIENT_ID_FILE"), - }, - &cli.StringFlag{ - EnvVars: []string{"WOODPECKER_BITBUCKET_DC_CLIENT_SECRET"}, - Name: "bitbucket-dc-client-secret", - Usage: "Bitbucket DataCenter/Server OAuth 2.0 client secret", - FilePath: os.Getenv("WOODPECKER_BITBUCKET_DC_CLIENT_SECRET_FILE"), - }, &cli.StringFlag{ EnvVars: []string{"WOODPECKER_BITBUCKET_DC_GIT_USERNAME"}, Name: "bitbucket-dc-git-username", diff --git a/cmd/server/server.go b/cmd/server/server.go index 3eb3b4bbc..39ddc2580 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -38,7 +38,7 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc/proto" "go.woodpecker-ci.org/woodpecker/v2/server" "go.woodpecker-ci.org/woodpecker/v2/server/cron" - "go.woodpecker-ci.org/woodpecker/v2/server/forge" + "go.woodpecker-ci.org/woodpecker/v2/server/forge/setup" woodpeckerGrpcServer "go.woodpecker-ci.org/woodpecker/v2/server/grpc" "go.woodpecker-ci.org/woodpecker/v2/server/logging" "go.woodpecker-ci.org/woodpecker/v2/server/model" @@ -82,11 +82,6 @@ func run(c *cli.Context) error { ) } - _forge, err := setupForge(c) - if err != nil { - return fmt.Errorf("can't setup forge: %w", err) - } - _store, err := setupStore(c) if err != nil { return fmt.Errorf("can't setup store: %w", err) @@ -97,7 +92,7 @@ func run(c *cli.Context) error { } }() - err = setupEvilGlobals(c, _store, _forge) + err = setupEvilGlobals(c, _store) if err != nil { return fmt.Errorf("can't setup globals: %w", err) } @@ -107,7 +102,7 @@ func run(c *cli.Context) error { setupMetrics(&g, _store) g.Go(func() error { - return cron.Start(c.Context, _store, _forge) + return cron.Start(c.Context, _store) }) // start the grpc server @@ -130,7 +125,6 @@ func run(c *cli.Context) error { ) woodpeckerServer := woodpeckerGrpcServer.NewWoodpeckerServer( - _forge, server.Config.Services.Queue, server.Config.Services.Logs, server.Config.Services.Pubsub, @@ -270,17 +264,13 @@ func run(c *cli.Context) error { return g.Wait() } -func setupEvilGlobals(c *cli.Context, s store.Store, f forge.Forge) error { - // forge - server.Config.Services.Forge = f - +func setupEvilGlobals(c *cli.Context, s store.Store) error { // services server.Config.Services.Queue = setupQueue(c, s) server.Config.Services.Logs = logging.New() server.Config.Services.Pubsub = pubsub.New() - server.Config.Services.Membership = setupMembershipService(c, f) - - serviceMangager, err := services.NewManager(c, s) + server.Config.Services.Membership = setupMembershipService(c, s) + serviceMangager, err := services.NewManager(c, s, setup.Forge) if err != nil { return fmt.Errorf("could not setup service manager: %w", err) } diff --git a/cmd/server/setup.go b/cmd/server/setup.go index e2fa13e25..8df86cc86 100644 --- a/cmd/server/setup.go +++ b/cmd/server/setup.go @@ -18,9 +18,7 @@ package main import ( "context" "fmt" - "net/url" "os" - "strings" "time" "github.com/prometheus/client_golang/prometheus" @@ -31,13 +29,6 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/server" "go.woodpecker-ci.org/woodpecker/v2/server/cache" - "go.woodpecker-ci.org/woodpecker/v2/server/forge" - "go.woodpecker-ci.org/woodpecker/v2/server/forge/addon" - "go.woodpecker-ci.org/woodpecker/v2/server/forge/bitbucket" - "go.woodpecker-ci.org/woodpecker/v2/server/forge/bitbucketdatacenter" - "go.woodpecker-ci.org/woodpecker/v2/server/forge/gitea" - "go.woodpecker-ci.org/woodpecker/v2/server/forge/github" - "go.woodpecker-ci.org/woodpecker/v2/server/forge/gitlab" "go.woodpecker-ci.org/woodpecker/v2/server/queue" "go.woodpecker-ci.org/woodpecker/v2/server/store" "go.woodpecker-ci.org/woodpecker/v2/server/store/datastore" @@ -100,103 +91,8 @@ func setupQueue(c *cli.Context, s store.Store) queue.Queue { return queue.WithTaskStore(queue.New(c.Context), s) } -func setupMembershipService(_ *cli.Context, r forge.Forge) cache.MembershipService { - return cache.NewMembershipService(r) -} - -// setupForge helper function to set up the forge from the CLI arguments. -func setupForge(c *cli.Context) (forge.Forge, error) { - switch { - case c.String("addon-forge") != "": - return addon.Load(c.String("addon-forge")) - case c.Bool("github"): - return setupGitHub(c) - case c.Bool("gitlab"): - return setupGitLab(c) - case c.Bool("bitbucket"): - return setupBitbucket(c) - case c.Bool("bitbucket-dc"): - return setupBitbucketDatacenter(c) - case c.Bool("gitea"): - return setupGitea(c) - default: - return nil, fmt.Errorf("version control system not configured") - } -} - -// setupBitbucket helper function to setup the Bitbucket forge from the CLI arguments. -func setupBitbucket(c *cli.Context) (forge.Forge, error) { - opts := &bitbucket.Opts{ - Client: c.String("bitbucket-client"), - Secret: c.String("bitbucket-secret"), - } - log.Trace().Msgf("forge (bitbucket) opts: %#v", opts) - return bitbucket.New(opts) -} - -// setupGitea helper function to set up the Gitea forge from the CLI arguments. -func setupGitea(c *cli.Context) (forge.Forge, error) { - server, err := url.Parse(c.String("gitea-server")) - if err != nil { - return nil, err - } - oauth2Server := c.String("gitea-oauth-server") - if oauth2Server != "" { - oauth2URL, err := url.Parse(oauth2Server) - if err != nil { - return nil, err - } - oauth2Server = strings.TrimRight(oauth2URL.String(), "/") - } - opts := gitea.Opts{ - URL: strings.TrimRight(server.String(), "/"), - OAuth2URL: oauth2Server, - Client: c.String("gitea-client"), - Secret: c.String("gitea-secret"), - SkipVerify: c.Bool("gitea-skip-verify"), - } - if len(opts.URL) == 0 { - return nil, fmt.Errorf("WOODPECKER_GITEA_URL must be set") - } - log.Trace().Msgf("forge (gitea) opts: %#v", opts) - return gitea.New(opts) -} - -// setupBitbucketDatacenter helper function to setup the Bitbucket DataCenter/Server forge from the CLI arguments. -func setupBitbucketDatacenter(c *cli.Context) (forge.Forge, error) { - opts := bitbucketdatacenter.Opts{ - URL: c.String("bitbucket-dc-server"), - Username: c.String("bitbucket-dc-git-username"), - Password: c.String("bitbucket-dc-git-password"), - ClientID: c.String("bitbucket-dc-client-id"), - ClientSecret: c.String("bitbucket-dc-client-secret"), - } - log.Trace().Msgf("Forge (bitbucketdatacenter) opts: %#v", opts) - return bitbucketdatacenter.New(opts) -} - -// setupGitLab helper function to setup the GitLab forge from the CLI arguments. -func setupGitLab(c *cli.Context) (forge.Forge, error) { - return gitlab.New(gitlab.Opts{ - URL: c.String("gitlab-server"), - ClientID: c.String("gitlab-client"), - ClientSecret: c.String("gitlab-secret"), - SkipVerify: c.Bool("gitlab-skip-verify"), - }) -} - -// setupGitHub helper function to setup the GitHub forge from the CLI arguments. -func setupGitHub(c *cli.Context) (forge.Forge, error) { - opts := github.Opts{ - URL: c.String("github-server"), - Client: c.String("github-client"), - Secret: c.String("github-secret"), - SkipVerify: c.Bool("github-skip-verify"), - MergeRef: c.Bool("github-merge-ref"), - OnlyPublic: c.Bool("github-public-only"), - } - log.Trace().Msgf("forge (github) opts: %#v", opts) - return github.New(opts) +func setupMembershipService(_ *cli.Context, _store store.Store) cache.MembershipService { + return cache.NewMembershipService(_store) } func setupMetrics(g *errgroup.Group, _store store.Store) { diff --git a/docker/Dockerfile.make b/docker/Dockerfile.make index 5f508a562..84f8e3140 100644 --- a/docker/Dockerfile.make +++ b/docker/Dockerfile.make @@ -1,17 +1,19 @@ # docker build --rm -f docker/Dockerfile.make -t woodpecker/make:local . -FROM docker.io/golang:1.22-alpine3.18 as golang_image -FROM docker.io/node:21-alpine3.18 +FROM docker.io/golang:1.22-alpine3.19 as golang_image +FROM docker.io/node:21-alpine3.19 -# renovate: datasource=repology depName=alpine_3_18/make versioning=loose -ENV MAKE_VERSION="4.4.1-r1" -# renovate: datasource=repology depName=alpine_3_18/gcc versioning=loose -ENV GCC_VERSION="12.2.1_git20220924-r10" -# renovate: datasource=repology depName=alpine_3_18/binutils-gold versioning=loose -ENV BINUTILS_GOLD_VERSION="2.40-r7" -# renovate: datasource=repology depName=alpine_3_18/musl-dev versioning=loose -ENV MUSL_DEV_VERSION="1.2.4-r2" +# 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} && \ +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} && \ corepack enable # Build packages. @@ -20,9 +22,12 @@ COPY Makefile / ENV PATH=$PATH:/usr/local/go/bin # Cache tools -RUN make install-tools && \ - mv /root/go/bin/* /usr/local/go/bin/ && \ - chmod 755 /usr/local/go/bin/* +RUN GOBIN=/usr/local/go/bin make install-tools && \ + rm -rf /Makefile + +ENV GOPATH=/tmp/go +ENV HOME=/tmp/home +ENV PATH=$PATH:/usr/local/go/bin:/tmp/go/bin WORKDIR /build RUN chmod -R 777 /root diff --git a/docs/plugins/woodpecker-plugins/plugins.json b/docs/plugins/woodpecker-plugins/plugins.json index 8480438cd..a1c68db2f 100644 --- a/docs/plugins/woodpecker-plugins/plugins.json +++ b/docs/plugins/woodpecker-plugins/plugins.json @@ -194,6 +194,11 @@ "name": "Forge deployments", "docs": "https://raw.githubusercontent.com/woodpecker-ci/plugin-deployments/main/docs.md", "verified": true + }, + { + "name": "Twine", + "docs": "https://gitea.elara.ws/music-kraken/plugin-twine/raw/branch/master/docs.md", + "verified": false } ] } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index ef93a5fbf..282057bf9 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -14,22 +14,22 @@ importers: dependencies: '@docusaurus/core': specifier: ^3.1.0 - version: 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) + version: 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) '@docusaurus/plugin-content-blog': specifier: ^3.1.0 - version: 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) + version: 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) '@docusaurus/preset-classic': specifier: ^3.1.0 - version: 3.1.1(@algolia/client-search@4.22.1)(@types/react@18.2.70)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.4.3) + version: 3.2.1(@algolia/client-search@4.23.3)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.4.5) '@easyops-cn/docusaurus-search-local': specifier: ^0.40.1 - version: 0.40.1(@docusaurus/theme-common@3.1.1)(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) + version: 0.40.1(@docusaurus/theme-common@3.2.1)(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) '@mdx-js/react': specifier: ^3.0.0 - version: 3.0.1(@types/react@18.2.70)(react@18.2.0) + version: 3.0.1(@types/react@18.2.79)(react@18.2.0) '@svgr/webpack': specifier: ^8.1.0 - version: 8.1.0(typescript@5.4.3) + version: 8.1.0(typescript@5.4.5) clsx: specifier: ^2.1.0 version: 2.1.0 @@ -50,26 +50,26 @@ importers: version: 18.2.0(react@18.2.0) redocusaurus: specifier: ^2.0.2 - version: 2.0.2(@docusaurus/theme-common@3.1.1)(@docusaurus/utils@3.1.1)(core-js@3.36.1)(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8)(webpack@5.91.0) + version: 2.0.2(@docusaurus/theme-common@3.2.1)(@docusaurus/utils@3.2.1)(core-js@3.36.1)(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8)(webpack@5.91.0) url-loader: specifier: ^4.1.1 version: 4.1.1(file-loader@6.2.0)(webpack@5.91.0) devDependencies: '@docusaurus/module-type-aliases': specifier: ^3.1.0 - version: 3.1.1(react-dom@18.2.0)(react@18.2.0) + version: 3.2.1(react-dom@18.2.0)(react@18.2.0) '@docusaurus/tsconfig': specifier: 3.1.1 version: 3.1.1 '@docusaurus/types': specifier: ^3.1.0 - version: 3.1.1(react-dom@18.2.0)(react@18.2.0) + version: 3.2.1(react-dom@18.2.0)(react@18.2.0) '@types/node': specifier: ^20.11.30 - version: 20.11.30 + version: 20.12.7 '@types/react': specifier: ^18.2.67 - version: 18.2.70 + version: 18.2.79 '@types/react-helmet': specifier: ^6.1.11 version: 6.1.11 @@ -78,7 +78,7 @@ importers: version: 5.3.3 typescript: specifier: ^5.4.3 - version: 5.4.3 + version: 5.4.5 plugins/woodpecker-plugins: dependencies: @@ -97,22 +97,22 @@ importers: devDependencies: '@docusaurus/module-type-aliases': specifier: ^3.0.0 - version: 3.1.1(react-dom@18.2.0)(react@18.2.0) + version: 3.2.1(react-dom@18.2.0)(react@18.2.0) '@docusaurus/theme-classic': specifier: ^3.0.0 - version: 3.1.1(@types/react@18.2.70)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) + version: 3.2.1(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) '@docusaurus/types': specifier: ^3.0.0 - version: 3.1.1(react-dom@18.2.0)(react@18.2.0) + version: 3.2.1(react-dom@18.2.0)(react@18.2.0) '@tsconfig/docusaurus': specifier: ^2.0.0 - version: 2.0.2 + version: 2.0.3 '@types/marked': specifier: ^6.0.0 version: 6.0.0 '@types/node': specifier: ^20.11.30 - version: 20.11.30 + version: 20.12.7 axios: specifier: ^1.6.8 version: 1.6.8 @@ -121,7 +121,7 @@ importers: version: 8.2.2 isomorphic-dompurify: specifier: ^2.5.0 - version: 2.6.0 + version: 2.7.0 marked: specifier: ^12.0.1 version: 12.0.1 @@ -130,146 +130,162 @@ importers: version: 2.6.2 typescript: specifier: ^5.4.3 - version: 5.4.3 + version: 5.4.5 packages: - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0): + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights dev: false - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0): + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0): resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch dev: false - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1): + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3): resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) - '@algolia/client-search': 4.22.1 - algoliasearch: 4.22.1 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) + '@algolia/client-search': 4.23.3 + algoliasearch: 4.23.3 dev: false - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1): + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3): resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/client-search': 4.22.1 - algoliasearch: 4.22.1 + '@algolia/client-search': 4.23.3 + algoliasearch: 4.23.3 dev: false - /@algolia/cache-browser-local-storage@4.22.1: - resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} + /@algolia/cache-browser-local-storage@4.23.3: + resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} dependencies: - '@algolia/cache-common': 4.22.1 + '@algolia/cache-common': 4.23.3 dev: false - /@algolia/cache-common@4.22.1: - resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} + /@algolia/cache-common@4.23.3: + resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} dev: false - /@algolia/cache-in-memory@4.22.1: - resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==} + /@algolia/cache-in-memory@4.23.3: + resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} dependencies: - '@algolia/cache-common': 4.22.1 + '@algolia/cache-common': 4.23.3 dev: false - /@algolia/client-account@4.22.1: - resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==} + /@algolia/client-account@4.23.3: + resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/client-analytics@4.22.1: - resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==} + /@algolia/client-analytics@4.23.3: + resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/client-common@4.22.1: - resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} + /@algolia/client-common@4.23.3: + resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} dependencies: - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/client-personalization@4.22.1: - resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==} + /@algolia/client-personalization@4.23.3: + resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/client-search@4.22.1: - resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} + /@algolia/client-search@4.23.3: + resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false /@algolia/events@4.0.1: resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} dev: false - /@algolia/logger-common@4.22.1: - resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} + /@algolia/logger-common@4.23.3: + resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} dev: false - /@algolia/logger-console@4.22.1: - resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==} + /@algolia/logger-console@4.23.3: + resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} dependencies: - '@algolia/logger-common': 4.22.1 + '@algolia/logger-common': 4.23.3 dev: false - /@algolia/requester-browser-xhr@4.22.1: - resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==} + /@algolia/recommend@4.23.3: + resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} dependencies: - '@algolia/requester-common': 4.22.1 + '@algolia/cache-browser-local-storage': 4.23.3 + '@algolia/cache-common': 4.23.3 + '@algolia/cache-in-memory': 4.23.3 + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/logger-console': 4.23.3 + '@algolia/requester-browser-xhr': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/requester-node-http': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/requester-common@4.22.1: - resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} - dev: false - - /@algolia/requester-node-http@4.22.1: - resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==} + /@algolia/requester-browser-xhr@4.23.3: + resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} dependencies: - '@algolia/requester-common': 4.22.1 + '@algolia/requester-common': 4.23.3 dev: false - /@algolia/transporter@4.22.1: - resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} + /@algolia/requester-common@4.23.3: + resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} + dev: false + + /@algolia/requester-node-http@4.23.3: + resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} dependencies: - '@algolia/cache-common': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/requester-common': 4.22.1 + '@algolia/requester-common': 4.23.3 + dev: false + + /@algolia/transporter@4.23.3: + resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} + dependencies: + '@algolia/cache-common': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/requester-common': 4.23.3 dev: false /@ampproject/remapping@2.3.0: @@ -286,21 +302,21 @@ packages: '@babel/highlight': 7.24.2 picocolors: 1.0.0 - /@babel/compat-data@7.24.1: - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + /@babel/compat-data@7.24.4: + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.3: - resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + /@babel/core@7.24.4: + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 + '@babel/generator': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helpers': 7.24.1 - '@babel/parser': 7.24.1 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 '@babel/template': 7.24.0 '@babel/traverse': 7.24.1 '@babel/types': 7.24.0 @@ -312,8 +328,8 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.24.1: - resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + /@babel/generator@7.24.4: + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.0 @@ -337,46 +353,46 @@ packages: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.24.1 + '@babel/compat-data': 7.24.4 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} + /@babel/helper-create-class-features-plugin@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.3): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.4): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.3): + /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.4): resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 debug: 4.3.4 @@ -414,13 +430,13 @@ packages: dependencies: '@babel/types': 7.24.0 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 @@ -437,24 +453,24 @@ packages: resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.3): + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.4): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.3): + /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -497,8 +513,8 @@ packages: '@babel/template': 7.24.0 '@babel/types': 7.24.0 - /@babel/helpers@7.24.1: - resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + /@babel/helpers@7.24.4: + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 @@ -516,920 +532,931 @@ packages: js-tokens: 4.0.0 picocolors: 1.0.0 - /@babel/parser@7.24.1: - resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.24.0 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.3): + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.24.0 + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.3): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.3): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.3): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.3): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.3): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.3): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.3): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.3): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.3): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.3): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.3): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3): + /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.3): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.4): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.3): + /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.4): resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.3) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} + /@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} + /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) - /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/template': 7.24.0 - /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-identifier': 7.22.20 - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.3): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.4): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) - /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.3) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) - /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) - /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-react-constant-elements@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-react-constant-elements@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.3): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.4): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.3): + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.4): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) '@babel/types': 7.24.0 - /@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.3): + /@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.4): resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.24.3 '@babel/helper-plugin-utils': 7.24.0 - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.3): - resolution: {integrity: sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==} + /@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.3) + '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.3): + /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) '@babel/helper-plugin-utils': 7.24.0 - /@babel/preset-env@7.24.3(@babel/core@7.24.3): - resolution: {integrity: sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==} + /@babel/preset-env@7.24.4(@babel/core@7.24.4): + resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.24.1 - '@babel/core': 7.24.3 + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.3) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.3) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.3) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.3) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.3) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.3) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.3) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.3) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.3) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.3) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.3) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.3) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.3) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.4) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.4) + '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.4) + '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.4) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.4) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.4) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.4) core-js-compat: 3.36.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.3): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.4): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/types': 7.24.0 esutils: 2.0.3 - /@babel/preset-react@7.24.1(@babel/core@7.24.3): + /@babel/preset-react@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.3) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) - '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.4) + '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.24.4) - /@babel/preset-typescript@7.24.1(@babel/core@7.24.3): + /@babel/preset-typescript@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.3) - '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typescript': 7.24.4(@babel/core@7.24.4) /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - /@babel/runtime-corejs3@7.24.1: - resolution: {integrity: sha512-T9ko/35G+Bkl+win48GduaPlhSlOjjE5s1TeiEcD+QpxlLQnoEfb/nO/T+TQqkm+ipFwORn+rB8w14iJ/uD0bg==} + /@babel/runtime-corejs3@7.24.4: + resolution: {integrity: sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==} engines: {node: '>=6.9.0'} dependencies: core-js-pure: 3.36.1 regenerator-runtime: 0.14.1 - /@babel/runtime@7.24.1: - resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -1439,7 +1466,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 /@babel/traverse@7.24.1: @@ -1447,12 +1474,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.1 + '@babel/generator': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.1 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 debug: 4.3.4 globals: 11.12.0 @@ -1481,7 +1508,7 @@ packages: resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} dev: false - /@docsearch/react@3.6.0(@algolia/client-search@4.22.1)(@types/react@18.2.70)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0): + /@docsearch/react@3.6.0(@algolia/client-search@4.23.3)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0): resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -1498,11 +1525,11 @@ packages: search-insights: optional: true dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) '@docsearch/css': 3.6.0 - '@types/react': 18.2.70 - algoliasearch: 4.22.1 + '@types/react': 18.2.79 + algoliasearch: 4.23.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) search-insights: 2.13.0 @@ -1510,35 +1537,34 @@ packages: - '@algolia/client-search' dev: false - /@docusaurus/core@3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ==} + /@docusaurus/core@3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-ZeMAqNvy0eBv2dThEeMuNzzuu+4thqMQakhxsgT5s02A8LqRcdkg+rbcnuNqUIpekQ4GRx3+M5nj0ODJhBXo9w==} engines: {node: '>=18.0'} hasBin: true peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/generator': 7.24.1 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.3) - '@babel/plugin-transform-runtime': 7.24.3(@babel/core@7.24.3) - '@babel/preset-env': 7.24.3(@babel/core@7.24.3) - '@babel/preset-react': 7.24.1(@babel/core@7.24.3) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.3) - '@babel/runtime': 7.24.1 - '@babel/runtime-corejs3': 7.24.1 + '@babel/core': 7.24.4 + '@babel/generator': 7.24.4 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) + '@babel/plugin-transform-runtime': 7.24.3(@babel/core@7.24.4) + '@babel/preset-env': 7.24.4(@babel/core@7.24.4) + '@babel/preset-react': 7.24.1(@babel/core@7.24.4) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) + '@babel/runtime': 7.24.4 + '@babel/runtime-corejs3': 7.24.4 '@babel/traverse': 7.24.1 - '@docusaurus/cssnano-preset': 3.1.1 - '@docusaurus/logger': 3.1.1 - '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/cssnano-preset': 3.2.1 + '@docusaurus/logger': 3.2.1 + '@docusaurus/mdx-loader': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/react-loadable': 5.5.2(react@18.2.0) - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) - '@slorber/static-site-generator-webpack-plugin': 4.0.7 + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-common': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) '@svgr/webpack': 6.5.1 autoprefixer: 10.4.19(postcss@8.4.38) - babel-loader: 9.1.3(@babel/core@7.24.3)(webpack@5.91.0) + babel-loader: 9.1.3(@babel/core@7.24.4)(webpack@5.91.0) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 @@ -1549,13 +1575,14 @@ packages: commander: 5.1.0 copy-webpack-plugin: 11.0.0(webpack@5.91.0) core-js: 3.36.1 - css-loader: 6.10.0(webpack@5.91.0) + css-loader: 6.11.0(webpack@5.91.0) css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.3)(webpack@5.91.0) cssnano: 5.1.15(postcss@8.4.38) del: 6.1.1 detect-port: 1.5.1 escape-html: 1.0.3 eta: 2.2.0 + eval: 0.1.8 file-loader: 6.2.0(webpack@5.91.0) fs-extra: 11.2.0 html-minifier-terser: 7.2.0 @@ -1564,11 +1591,12 @@ packages: leven: 3.1.0 lodash: 4.17.21 mini-css-extract-plugin: 2.8.1(webpack@5.91.0) + p-map: 4.0.0 postcss: 8.4.38 - postcss-loader: 7.3.4(postcss@8.4.38)(typescript@5.4.3)(webpack@5.91.0) + postcss-loader: 7.3.4(postcss@8.4.38)(typescript@5.4.5)(webpack@5.91.0) prompts: 2.4.2 react: 18.2.0 - react-dev-utils: 12.0.1(typescript@5.4.3)(webpack@5.91.0) + react-dev-utils: 12.0.1(typescript@5.4.5)(webpack@5.91.0) react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) @@ -1585,7 +1613,7 @@ packages: update-notifier: 6.0.2 url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.91.0) webpack: 5.91.0 - webpack-bundle-analyzer: 4.10.1 + webpack-bundle-analyzer: 4.10.2 webpack-dev-server: 4.15.2(debug@4.3.4)(webpack@5.91.0) webpack-merge: 5.10.0 webpackbar: 5.0.2(webpack@5.91.0) @@ -1608,8 +1636,8 @@ packages: - vue-template-compiler - webpack-cli - /@docusaurus/cssnano-preset@3.1.1: - resolution: {integrity: sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g==} + /@docusaurus/cssnano-preset@3.2.1: + resolution: {integrity: sha512-wTL9KuSSbMJjKrfu385HZEzAoamUsbKqwscAQByZw4k6Ja/RWpqgVvt/CbAC+aYEH6inLzOt+MjuRwMOrD3VBA==} engines: {node: '>=18.0'} dependencies: cssnano-preset-advanced: 5.3.10(postcss@8.4.38) @@ -1617,29 +1645,27 @@ packages: postcss-sort-media-queries: 4.4.1(postcss@8.4.38) tslib: 2.6.2 - /@docusaurus/logger@3.1.1: - resolution: {integrity: sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q==} + /@docusaurus/logger@3.2.1: + resolution: {integrity: sha512-0voOKJCn9RaM3np6soqEfo7SsVvf2C+CDTWhW+H/1AyBhybASpExtDEz+7ECck9TwPzFQ5tt+I3zVugUJbJWDg==} engines: {node: '>=18.0'} dependencies: chalk: 4.1.2 tslib: 2.6.2 - /@docusaurus/mdx-loader@3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xN2IccH9+sv7TmxwsDJNS97BHdmlqWwho+kIVY4tcCXkp+k4QuzvWBeunIMzeayY4Fu13A6sAjHGv5qm72KyGA==} + /@docusaurus/mdx-loader@3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Fs8tXhXKZjNkdGaOy1xSLXSwfjCMT73J3Zfrju2U16uGedRFRjgK0ojpK5tiC7TnunsL3tOFgp1BSMBRflX9gw==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@babel/parser': 7.24.1 - '@babel/traverse': 7.24.1 - '@docusaurus/logger': 3.1.1 - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/logger': 3.2.1 + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) '@mdx-js/mdx': 3.0.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 - estree-util-value-to-estree: 3.0.1 + estree-util-value-to-estree: 3.1.1 file-loader: 6.2.0(webpack@5.91.0) fs-extra: 11.2.0 image-size: 1.1.1 @@ -1667,16 +1693,16 @@ packages: - uglify-js - webpack-cli - /@docusaurus/module-type-aliases@3.1.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-xBJyx0TMfAfVZ9ZeIOb1awdXgR4YJMocIEzTps91rq+hJDFJgJaylDtmoRhUxkwuYmNK1GJpW95b7DLztSBJ3A==} + /@docusaurus/module-type-aliases@3.2.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-FyViV5TqhL1vsM7eh29nJ5NtbRE6Ra6LP1PDcPvhwPSlA7eiWGRKAn3jWwMUcmjkos5SYY+sr0/feCdbM3eQHQ==} peerDependencies: react: '*' react-dom: '*' dependencies: '@docusaurus/react-loadable': 5.5.2(react@18.2.0) - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) '@types/history': 4.7.11 - '@types/react': 18.2.70 + '@types/react': 18.2.79 '@types/react-router-config': 5.0.11 '@types/react-router-dom': 5.3.3 react: 18.2.0 @@ -1690,20 +1716,20 @@ packages: - uglify-js - webpack-cli - /@docusaurus/plugin-content-blog@3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-ew/3VtVoG3emoAKmoZl7oKe1zdFOsI0NbcHS26kIxt2Z8vcXKCUgK9jJJrz0TbOipyETPhqwq4nbitrY3baibg==} + /@docusaurus/plugin-content-blog@3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-lOx0JfhlGZoZu6pEJfeEpSISZR5dQbJGGvb42IP13G5YThNHhG9R9uoWuo4IOimPqBC7sHThdLA3VLevk61Fsw==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/logger': 3.1.1 - '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/logger': 3.2.1 + '@docusaurus/mdx-loader': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-common': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) cheerio: 1.0.0-rc.12 feed: 4.2.2 fs-extra: 11.2.0 @@ -1734,20 +1760,21 @@ packages: - vue-template-compiler - webpack-cli - /@docusaurus/plugin-content-docs@3.1.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-lhFq4E874zw0UOH7ujzxnCayOyAt0f9YPVYSb9ohxrdCM8B4szxitUw9rIX4V9JLLHVoqIJb6k+lJJ1jrcGJ0A==} + /@docusaurus/plugin-content-docs@3.2.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-GHe5b/lCskAR8QVbfWAfPAApvRZgqk7FN3sOHgjCtjzQACZxkHmq6QqyqZ8Jp45V7lVck4wt2Xw2IzBJ7Cz3bA==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/logger': 3.1.1 - '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/logger': 3.2.1 + '@docusaurus/mdx-loader': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-common': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.2.0 @@ -1776,18 +1803,18 @@ packages: - vue-template-compiler - webpack-cli - /@docusaurus/plugin-content-pages@3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-NQHncNRAJbyLtgTim9GlEnNYsFhuCxaCNkMwikuxLTiGIPH7r/jpb7O3f3jUMYMebZZZrDq5S7om9a6rvB/YCA==} + /@docusaurus/plugin-content-pages@3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-TOqVfMVTAHqWNEGM94Drz+PUpHDbwFy6ucHFgyTx9zJY7wPNSG5EN+rd/mU7OvAi26qpOn2o9xTdUmb28QLjEQ==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/mdx-loader': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) fs-extra: 11.2.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -1811,16 +1838,16 @@ packages: - vue-template-compiler - webpack-cli - /@docusaurus/plugin-debug@3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-xWeMkueM9wE/8LVvl4+Qf1WqwXmreMjI5Kgr7GYCDoJ8zu4kD+KaMhrh7py7MNM38IFvU1RfrGKacCEe2DRRfQ==} + /@docusaurus/plugin-debug@3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-AMKq8NuUKf2sRpN1m/sIbqbRbnmk+rSA+8mNU1LNxEl9BW9F/Gng8m9HKlzeyMPrf5XidzS1jqkuTLDJ6KIrFw==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) fs-extra: 11.2.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -1845,16 +1872,16 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-analytics@3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-+q2UpWTqVi8GdlLoSlD5bS/YpxW+QMoBwrPrUH/NpvpuOi0Of7MTotsQf9JWd3hymZxl2uu1o3PIrbpxfeDFDQ==} + /@docusaurus/plugin-google-analytics@3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-/rJ+9u+Px0eTCiF4TNcNtj3kHf8cp6K1HCwOTdbsSlz6Xn21syZYcy+f1VM9wF6HrvUkXUcbM5TDCvg2IRL6bQ==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -1877,16 +1904,16 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-gtag@3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-0mMPiBBlQ5LFHTtjxuvt/6yzh8v7OxLi3CbeEsxXZpUzcKO/GC7UA1VOWUoBeQzQL508J12HTAlR3IBU9OofSw==} + /@docusaurus/plugin-google-gtag@3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-XtuJnlMvYfppeVdUyKiDIJAa/gTJKCQU92z8CLZZ9ibJdgVjFOLS10s0hIC0eL5z0U2u2loJz2rZ63HOkNHbBA==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) '@types/gtag.js': 0.0.12 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -1910,16 +1937,16 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-tag-manager@3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-d07bsrMLdDIryDtY17DgqYUbjkswZQr8cLWl4tzXrt5OR/T/zxC1SYKajzB3fd87zTu5W5klV5GmUwcNSMXQXA==} + /@docusaurus/plugin-google-tag-manager@3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-wiS/kE0Ny5pnjTxVCs8ljRnkL1RVMj59t6jmSsgEX7piDOoaXSMIUaoIt9ogS/v132uO0xEsxHstkRUZHQyPcQ==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) tslib: 2.6.2 @@ -1942,19 +1969,19 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-sitemap@3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-iJ4hCaMmDaUqRv131XJdt/C/jJQx8UreDWTRqZKtNydvZVh/o4yXGRRFOplea1D9b/zpwL1Y+ZDwX7xMhIOTmg==} + /@docusaurus/plugin-sitemap@3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-uWZ7AxzdeaQSTCwD2yZtOiEm9zyKU+wqCmi/Sf25kQQqqFSBZUStXfaQ8OHP9cecnw893ZpZ811rPhB/wfujJw==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/logger': 3.1.1 - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/logger': 3.2.1 + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-common': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) fs-extra: 11.2.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -1979,26 +2006,26 @@ packages: - webpack-cli dev: false - /@docusaurus/preset-classic@3.1.1(@algolia/client-search@4.22.1)(@types/react@18.2.70)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.4.3): - resolution: {integrity: sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg==} + /@docusaurus/preset-classic@3.2.1(@algolia/client-search@4.23.3)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.4.5): + resolution: {integrity: sha512-E3OHSmttpEBcSMhfPBq3EJMBxZBM01W1rnaCUTXy9EHvkmB5AwgTfW1PwGAybPAX579ntE03R+2zmXdizWfKnQ==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-content-blog': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-content-docs': 3.1.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-content-pages': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-debug': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-google-analytics': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-google-gtag': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-google-tag-manager': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-sitemap': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/theme-classic': 3.1.1(@types/react@18.2.70)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/theme-search-algolia': 3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.70)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.4.3) - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-content-blog': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-content-docs': 3.2.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-content-pages': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-debug': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-google-analytics': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-google-gtag': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-google-tag-manager': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-sitemap': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/theme-classic': 3.2.1(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/theme-common': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/theme-search-algolia': 3.2.1(@algolia/client-search@4.23.3)(@docusaurus/types@3.2.1)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.4.5) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -2028,30 +2055,30 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 18.2.70 + '@types/react': 18.2.79 prop-types: 15.8.1 react: 18.2.0 - /@docusaurus/theme-classic@3.1.1(@types/react@18.2.70)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-GiPE/jbWM8Qv1A14lk6s9fhc0LhPEQ00eIczRO4QL2nAQJZXkjPG6zaVx+1cZxPFWbAsqSjKe2lqkwF3fGkQ7Q==} + /@docusaurus/theme-classic@3.2.1(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-+vSbnQyoWjc6vRZi4vJO2dBU02wqzynsai15KK+FANZudrYaBHtkbLZAQhgmxzBGVpxzi87gRohlMm+5D8f4tA==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-content-docs': 3.1.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-content-pages': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/theme-translations': 3.1.1 - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) - '@mdx-js/react': 3.0.1(@types/react@18.2.70)(react@18.2.0) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/mdx-loader': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-content-docs': 3.2.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-content-pages': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/theme-common': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/theme-translations': 3.2.1 + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-common': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) + '@mdx-js/react': 3.0.1(@types/react@18.2.79)(react@18.2.0) clsx: 2.1.0 copy-text-to-clipboard: 3.2.0 infima: 0.2.0-alpha.43 @@ -2085,22 +2112,22 @@ packages: - vue-template-compiler - webpack-cli - /@docusaurus/theme-common@3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): - resolution: {integrity: sha512-38urZfeMhN70YaXkwIGXmcUcv2CEYK/2l4b05GkJPrbEbgpsIZM3Xc+Js2ehBGGZmfZq8GjjQ5RNQYG+MYzCYg==} + /@docusaurus/theme-common@3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): + resolution: {integrity: sha512-d+adiD7L9xv6EvfaAwUqdKf4orsM3jqgeqAM+HAjgL/Ux0GkVVnfKr+tsoe+4ow4rHe6NUt+nkkW8/K8dKdilA==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docusaurus/mdx-loader': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 3.1.1(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-content-docs': 3.1.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/plugin-content-pages': 3.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/mdx-loader': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-content-docs': 3.2.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/plugin-content-pages': 3.2.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-common': 3.2.1(@docusaurus/types@3.2.1) '@types/history': 4.7.11 - '@types/react': 18.2.70 + '@types/react': 18.2.79 '@types/react-router-config': 5.0.11 clsx: 2.1.0 parse-numeric-range: 1.3.0 @@ -2128,23 +2155,23 @@ packages: - vue-template-compiler - webpack-cli - /@docusaurus/theme-search-algolia@3.1.1(@algolia/client-search@4.22.1)(@docusaurus/types@3.1.1)(@types/react@18.2.70)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.4.3): - resolution: {integrity: sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g==} + /@docusaurus/theme-search-algolia@3.2.1(@algolia/client-search@4.23.3)(@docusaurus/types@3.2.1)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.4.5): + resolution: {integrity: sha512-bzhCrpyXBXzeydNUH83II2akvFEGfhsNTPPWsk5N7e+odgQCQwoHhcF+2qILbQXjaoZ6B3c48hrvkyCpeyqGHw==} engines: {node: '>=18.0'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@docsearch/react': 3.6.0(@algolia/client-search@4.22.1)(@types/react@18.2.70)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) - '@docusaurus/core': 3.1.1(@docusaurus/types@3.1.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/logger': 3.1.1 - '@docusaurus/plugin-content-docs': 3.1.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/theme-translations': 3.1.1 - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) - algoliasearch: 4.22.1 - algoliasearch-helper: 3.16.3(algoliasearch@4.22.1) + '@docsearch/react': 3.6.0(@algolia/client-search@4.23.3)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) + '@docusaurus/core': 3.2.1(@docusaurus/types@3.2.1)(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/logger': 3.2.1 + '@docusaurus/plugin-content-docs': 3.2.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/theme-common': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/theme-translations': 3.2.1 + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) + algoliasearch: 4.23.3 + algoliasearch-helper: 3.17.0(algoliasearch@4.23.3) clsx: 2.1.0 eta: 2.2.0 fs-extra: 11.2.0 @@ -2176,8 +2203,8 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-translations@3.1.1: - resolution: {integrity: sha512-xvWQFwjxHphpJq5fgk37FXCDdAa2o+r7FX8IpMg+bGZBNXyWBu3MjZ+G4+eUVNpDhVinTc+j6ucL0Ain5KCGrg==} + /@docusaurus/theme-translations@3.2.1: + resolution: {integrity: sha512-jAUMkIkFfY+OAhJhv6mV8zlwY6J4AQxJPTgLdR2l+Otof9+QdJjHNh/ifVEu9q0lp3oSPlJj9l05AaP7Ref+cg==} engines: {node: '>=18.0'} dependencies: fs-extra: 11.2.0 @@ -2187,17 +2214,17 @@ packages: resolution: {integrity: sha512-FTBuY3KvaHfMVBgvlPmDQ+KS9Q/bYtVftq2ugou3PgBDJoQmw2aUZ4Sg15HKqLGbfIkxoy9t6cqE4Yw1Ta8Q1A==} dev: true - /@docusaurus/types@3.1.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==} + /@docusaurus/types@3.2.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-n/toxBzL2oxTtRTOFiGKsHypzn/Pm+sXyw+VSk1UbqbXQiHOwHwts55bpKwbcUgA530Is6kix3ELiFOv9GAMfw==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: '@mdx-js/mdx': 3.0.1 '@types/history': 4.7.11 - '@types/react': 18.2.70 + '@types/react': 18.2.79 commander: 5.1.0 - joi: 17.12.2 + joi: 17.12.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) @@ -2211,8 +2238,8 @@ packages: - uglify-js - webpack-cli - /@docusaurus/utils-common@3.1.1(@docusaurus/types@3.1.1): - resolution: {integrity: sha512-eGne3olsIoNfPug5ixjepZAIxeYFzHHnor55Wb2P57jNbtVaFvij/T+MS8U0dtZRFi50QU+UPmRrXdVUM8uyMg==} + /@docusaurus/utils-common@3.2.1(@docusaurus/types@3.2.1): + resolution: {integrity: sha512-N5vadULnRLiqX2QfTjVEU3u5vo6RG2EZTdyXvJdzDOdrLCGIZAfnf/VkssinFZ922sVfaFfQ4FnStdhn5TWdVg==} engines: {node: '>=18.0'} peerDependencies: '@docusaurus/types': '*' @@ -2220,16 +2247,17 @@ packages: '@docusaurus/types': optional: true dependencies: - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) tslib: 2.6.2 - /@docusaurus/utils-validation@3.1.1(@docusaurus/types@3.1.1): - resolution: {integrity: sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA==} + /@docusaurus/utils-validation@3.2.1(@docusaurus/types@3.2.1): + resolution: {integrity: sha512-+x7IR9hNMXi62L1YAglwd0s95fR7+EtirjTxSN4kahYRWGqOi3jlQl1EV0az/yTEvKbxVvOPcdYicGu9dk4LJw==} engines: {node: '>=18.0'} dependencies: - '@docusaurus/logger': 3.1.1 - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - joi: 17.12.2 + '@docusaurus/logger': 3.2.1 + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-common': 3.2.1(@docusaurus/types@3.2.1) + joi: 17.12.3 js-yaml: 4.1.0 tslib: 2.6.2 transitivePeerDependencies: @@ -2240,8 +2268,8 @@ packages: - uglify-js - webpack-cli - /@docusaurus/utils@3.1.1(@docusaurus/types@3.1.1): - resolution: {integrity: sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg==} + /@docusaurus/utils@3.2.1(@docusaurus/types@3.2.1): + resolution: {integrity: sha512-DPkIS/EPc+pGAV798PUXgNzJFM3HJouoQXgr0KDZuJVz1EkWbDLOcQwLIz8Qx7liI9ddfkN/TXTRQdsTPZNakw==} engines: {node: '>=18.0'} peerDependencies: '@docusaurus/types': '*' @@ -2249,8 +2277,9 @@ packages: '@docusaurus/types': optional: true dependencies: - '@docusaurus/logger': 3.1.1 - '@docusaurus/types': 3.1.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/logger': 3.2.1 + '@docusaurus/types': 3.2.1(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-common': 3.2.1(@docusaurus/types@3.2.1) '@svgr/webpack': 6.5.1 escape-string-regexp: 4.0.0 file-loader: 6.2.0(webpack@5.91.0) @@ -2262,6 +2291,7 @@ packages: js-yaml: 4.1.0 lodash: 4.17.21 micromatch: 4.0.5 + prompts: 2.4.2 resolve-pathname: 3.0.0 shelljs: 0.8.5 tslib: 2.6.2 @@ -2281,7 +2311,7 @@ packages: immediate: 3.3.0 dev: false - /@easyops-cn/docusaurus-search-local@0.40.1(@docusaurus/theme-common@3.1.1)(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): + /@easyops-cn/docusaurus-search-local@0.40.1(@docusaurus/theme-common@3.2.1)(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5): resolution: {integrity: sha512-4HMFZMpKKdd5qq1nFB8cvrAkgzZ1kNxphVciI64YHtmDYGIthVGZVG6+Ci7AAhzCR+ixLJkYwtVekvuMLjr2ZQ==} engines: {node: '>=12'} peerDependencies: @@ -2289,12 +2319,12 @@ packages: react: ^16.14.0 || ^17 || ^18 react-dom: ^16.14.0 || 17 || ^18 dependencies: - '@docusaurus/plugin-content-docs': 3.1.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/theme-translations': 3.1.1 - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-common': 3.1.1(@docusaurus/types@3.1.1) - '@docusaurus/utils-validation': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/plugin-content-docs': 3.2.1(debug@4.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/theme-common': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/theme-translations': 3.2.1 + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-common': 3.2.1(@docusaurus/types@3.2.1) + '@docusaurus/utils-validation': 3.2.1(@docusaurus/types@3.2.1) '@easyops-cn/autocomplete.js': 0.38.1 '@node-rs/jieba': 1.10.0 cheerio: 1.0.0-rc.12 @@ -2327,16 +2357,16 @@ packages: - webpack-cli dev: false - /@emnapi/core@1.1.0: - resolution: {integrity: sha512-gNEVZo0HhUfVjhr6rFG//HZXbauclxueiDxaKGBZHcK5h8i9pslABNPfG8kMwYTubAn3mV7AyOZN8gfPRgbU8A==} + /@emnapi/core@1.1.1: + resolution: {integrity: sha512-eu4KjHfXg3I+UUR7vSuwZXpRo4c8h4Rtb5Lu2F7Z4JqJFl/eidquONEBiRs6viXKpWBC3BaJBy68xGJ2j56idw==} requiresBuild: true dependencies: tslib: 2.6.2 dev: false optional: true - /@emnapi/runtime@1.1.0: - resolution: {integrity: sha512-gCGlE0fJGWalfy+wbFApjhKn6uoSVvopru77IPyxNKkjkaiSx2HxDS7eOYSmo9dcMIhmmIvoxiC3N9TM1c3EaA==} + /@emnapi/runtime@1.1.1: + resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==} requiresBuild: true dependencies: tslib: 2.6.2 @@ -2589,7 +2619,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.30 + '@types/node': 20.12.7 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -2624,8 +2654,8 @@ packages: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - /@leichtgewicht/ip-codec@2.0.4: - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + /@leichtgewicht/ip-codec@2.0.5: + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} /@mdx-js/mdx@3.0.1: resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} @@ -2633,7 +2663,7 @@ packages: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 - '@types/mdx': 2.0.12 + '@types/mdx': 2.0.13 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-build-jsx: 3.0.1 @@ -2656,22 +2686,22 @@ packages: transitivePeerDependencies: - supports-color - /@mdx-js/react@3.0.1(@types/react@18.2.70)(react@18.2.0): + /@mdx-js/react@3.0.1(@types/react@18.2.79)(react@18.2.0): resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==} peerDependencies: '@types/react': '>=16' react: '>=16' dependencies: - '@types/mdx': 2.0.12 - '@types/react': 18.2.70 + '@types/mdx': 2.0.13 + '@types/react': 18.2.79 react: 18.2.0 /@napi-rs/wasm-runtime@0.1.2: resolution: {integrity: sha512-8JuczewTFIZ/XIjHQ+YlQUydHvlKx2hkcxtuGwh+t/t5zWyZct6YG4+xjHcq8xyc/e7FmFwf42Zj2YgICwmlvA==} requiresBuild: true dependencies: - '@emnapi/core': 1.1.0 - '@emnapi/runtime': 1.1.0 + '@emnapi/core': 1.1.1 + '@emnapi/runtime': 1.1.1 '@tybys/wasm-util': 0.8.1 dev: false optional: true @@ -2913,185 +2943,177 @@ packages: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 - /@slorber/static-site-generator-webpack-plugin@4.0.7: - resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} - engines: {node: '>=14'} - dependencies: - eval: 0.1.8 - p-map: 4.0.0 - webpack-sources: 3.2.3 - - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.24.3): + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.24.4): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 - /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.3): + /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.24.4): resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 dev: false - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.3): + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.4): resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.3): + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.4): resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 - /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.24.3): + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.24.4): resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 - /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.24.3): + /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.24.4): resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 dev: false - /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.24.3): + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.24.4): resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 - /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.24.3): + /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.24.4): resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 dev: false - /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.24.3): + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.24.4): resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 - /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.24.3): + /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.24.4): resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 dev: false - /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.24.3): + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.24.4): resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 - /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.24.3): + /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.24.4): resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 dev: false - /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.24.3): + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.24.4): resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 - /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.24.3): + /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.24.4): resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 dev: false - /@svgr/babel-preset@6.5.1(@babel/core@7.24.3): + /@svgr/babel-preset@6.5.1(@babel/core@7.24.4): resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.24.3) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.3) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.3) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.24.3) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.24.3) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.24.3) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.24.3) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.24.4) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.24.4) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.24.4) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.24.4) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.24.4) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.24.4) - /@svgr/babel-preset@8.1.0(@babel/core@7.24.3): + /@svgr/babel-preset@8.1.0(@babel/core@7.24.4): resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.3 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.24.3) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.3) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.3) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.24.3) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.24.3) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.24.3) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.24.3) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.24.4) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.24.4) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.24.4) dev: false /@svgr/core@6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.3 - '@svgr/babel-preset': 6.5.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@svgr/babel-preset': 6.5.1(@babel/core@7.24.4) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 transitivePeerDependencies: - supports-color - /@svgr/core@8.1.0(typescript@5.4.3): + /@svgr/core@8.1.0(typescript@5.4.5): resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} engines: {node: '>=14'} dependencies: - '@babel/core': 7.24.3 - '@svgr/babel-preset': 8.1.0(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.24.4) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.4.3) + cosmiconfig: 8.3.6(typescript@5.4.5) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -3119,8 +3141,8 @@ packages: peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.24.3 - '@svgr/babel-preset': 6.5.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@svgr/babel-preset': 6.5.1(@babel/core@7.24.4) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -3133,9 +3155,9 @@ packages: peerDependencies: '@svgr/core': '*' dependencies: - '@babel/core': 7.24.3 - '@svgr/babel-preset': 8.1.0(@babel/core@7.24.3) - '@svgr/core': 8.1.0(typescript@5.4.3) + '@babel/core': 7.24.4 + '@svgr/babel-preset': 8.1.0(@babel/core@7.24.4) + '@svgr/core': 8.1.0(typescript@5.4.5) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: @@ -3153,14 +3175,14 @@ packages: deepmerge: 4.3.1 svgo: 2.8.0 - /@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0)(typescript@5.4.3): + /@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0)(typescript@5.4.5): resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} engines: {node: '>=14'} peerDependencies: '@svgr/core': '*' dependencies: - '@svgr/core': 8.1.0(typescript@5.4.3) - cosmiconfig: 8.3.6(typescript@5.4.3) + '@svgr/core': 8.1.0(typescript@5.4.5) + cosmiconfig: 8.3.6(typescript@5.4.5) deepmerge: 4.3.1 svgo: 3.2.0 transitivePeerDependencies: @@ -3171,29 +3193,29 @@ packages: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.3 - '@babel/plugin-transform-react-constant-elements': 7.24.1(@babel/core@7.24.3) - '@babel/preset-env': 7.24.3(@babel/core@7.24.3) - '@babel/preset-react': 7.24.1(@babel/core@7.24.3) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/plugin-transform-react-constant-elements': 7.24.1(@babel/core@7.24.4) + '@babel/preset-env': 7.24.4(@babel/core@7.24.4) + '@babel/preset-react': 7.24.1(@babel/core@7.24.4) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) transitivePeerDependencies: - supports-color - /@svgr/webpack@8.1.0(typescript@5.4.3): + /@svgr/webpack@8.1.0(typescript@5.4.5): resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} engines: {node: '>=14'} dependencies: - '@babel/core': 7.24.3 - '@babel/plugin-transform-react-constant-elements': 7.24.1(@babel/core@7.24.3) - '@babel/preset-env': 7.24.3(@babel/core@7.24.3) - '@babel/preset-react': 7.24.1(@babel/core@7.24.3) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.3) - '@svgr/core': 8.1.0(typescript@5.4.3) + '@babel/core': 7.24.4 + '@babel/plugin-transform-react-constant-elements': 7.24.1(@babel/core@7.24.4) + '@babel/preset-env': 7.24.4(@babel/core@7.24.4) + '@babel/preset-react': 7.24.1(@babel/core@7.24.4) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.4) + '@svgr/core': 8.1.0(typescript@5.4.5) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0)(typescript@5.4.3) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0)(typescript@5.4.5) transitivePeerDependencies: - supports-color - typescript @@ -3209,8 +3231,8 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} - /@tsconfig/docusaurus@2.0.2: - resolution: {integrity: sha512-12HWfYmgUl4M2o76/TFufGtI68wl2k/b8qPrIrG7ci9YJLrpAtadpy897Bz5v29Mlkr7a1Hq4KHdQTKtU+2rhQ==} + /@tsconfig/docusaurus@2.0.3: + resolution: {integrity: sha512-3l1L5PzWVa7l0691TjnsZ0yOIEwG9DziSqu5IPZPlI5Dowi7z42cEym8Y35GHbgHvPcBfNxfrbxm7Cncn4nByQ==} dev: true /@tybys/wasm-util@0.8.1: @@ -3230,31 +3252,31 @@ packages: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/bonjour@3.5.13: resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.11.30 + '@types/node': 20.12.7 '@types/responselike': 1.0.3 /@types/connect-history-api-fallback@1.5.4: resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} dependencies: - '@types/express-serve-static-core': 4.17.43 - '@types/node': 20.11.30 + '@types/express-serve-static-core': 4.19.0 + '@types/node': 20.12.7 /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/debug@4.1.12: resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -3270,11 +3292,11 @@ packages: /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@types/eslint': 8.56.6 + '@types/eslint': 8.56.9 '@types/estree': 1.0.5 - /@types/eslint@8.56.6: - resolution: {integrity: sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==} + /@types/eslint@8.56.9: + resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -3287,11 +3309,11 @@ packages: /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - /@types/express-serve-static-core@4.17.43: - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + /@types/express-serve-static-core@4.19.0: + resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} dependencies: - '@types/node': 20.11.30 - '@types/qs': 6.9.14 + '@types/node': 20.12.7 + '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -3299,9 +3321,9 @@ packages: resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.43 - '@types/qs': 6.9.14 - '@types/serve-static': 1.15.5 + '@types/express-serve-static-core': 4.19.0 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 /@types/gtag.js@0.0.12: resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} @@ -3327,7 +3349,7 @@ packages: /@types/http-proxy@1.17.14: resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/istanbul-lib-coverage@2.0.6: resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -3348,7 +3370,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/marked@6.0.0: resolution: {integrity: sha512-jmjpa4BwUsmhxcfsgUit/7A9KbrC48Q0q8KvnY107ogcjGgTFDlIL3RpihNpx2Mu1hM4mdFQjoVc4O6JoGKHsA==} @@ -3362,29 +3384,26 @@ packages: dependencies: '@types/unist': 3.0.2 - /@types/mdx@2.0.12: - resolution: {integrity: sha512-H9VZ9YqE+H28FQVchC83RCs5xQ2J7mAAv6qdDEaWmXEVl3OpdH+xfrSUzQ1lp7U7oSTRZ0RvW08ASPJsYBi7Cw==} + /@types/mdx@2.0.13: + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} /@types/mime@1.3.5: resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} /@types/node-forge@1.3.11: resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node@20.11.30: - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 @@ -3397,8 +3416,8 @@ packages: /@types/prop-types@15.7.12: resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - /@types/qs@6.9.14: - resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} /@types/range-parser@1.2.7: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -3406,40 +3425,39 @@ packages: /@types/react-helmet@6.1.11: resolution: {integrity: sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==} dependencies: - '@types/react': 18.2.70 + '@types/react': 18.2.79 dev: true /@types/react-router-config@5.0.11: resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.70 + '@types/react': 18.2.79 '@types/react-router': 5.1.20 /@types/react-router-dom@5.3.3: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.70 + '@types/react': 18.2.79 '@types/react-router': 5.1.20 /@types/react-router@5.1.20: resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.70 + '@types/react': 18.2.79 - /@types/react@18.2.70: - resolution: {integrity: sha512-hjlM2hho2vqklPhopNkXkdkeq6Lv8WSZTpr7956zY+3WS5cfYUewtCzsJLsbW5dEv3lfSeQ4W14ZFeKC437JRQ==} + /@types/react@18.2.79: + resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} dependencies: '@types/prop-types': 15.7.12 - '@types/scheduler': 0.16.8 csstype: 3.1.3 /@types/responselike@1.0.3: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -3447,34 +3465,31 @@ packages: /@types/sax@1.2.7: resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 dev: false - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - /@types/send@0.17.4: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/serve-index@1.9.4: resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} dependencies: '@types/express': 4.17.21 - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + /@types/serve-static@1.15.7: + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} dependencies: '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 20.11.30 + '@types/node': 20.12.7 + '@types/send': 0.17.4 /@types/sockjs@0.3.36: resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/stylis@4.2.0: resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} @@ -3493,7 +3508,7 @@ packages: /@types/ws@8.5.10: resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -3637,8 +3652,8 @@ packages: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: debug: 4.3.4 @@ -3694,32 +3709,33 @@ packages: require-from-string: 2.0.2 uri-js: 4.4.1 - /algoliasearch-helper@3.16.3(algoliasearch@4.22.1): - resolution: {integrity: sha512-1OuJT6sONAa9PxcOmWo5WCAT3jQSpCR9/m5Azujja7nhUQwAUDvaaAYrcmUySsrvHh74usZHbE3jFfGnWtZj8w==} + /algoliasearch-helper@3.17.0(algoliasearch@4.23.3): + resolution: {integrity: sha512-R5422OiQjvjlK3VdpNQ/Qk7KsTIGeM5ACm8civGifOVWdRRV/3SgXuKmeNxe94Dz6fwj/IgpVmXbHutU4mHubg==} peerDependencies: algoliasearch: '>= 3.1 < 6' dependencies: '@algolia/events': 4.0.1 - algoliasearch: 4.22.1 + algoliasearch: 4.23.3 dev: false - /algoliasearch@4.22.1: - resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} + /algoliasearch@4.23.3: + resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} dependencies: - '@algolia/cache-browser-local-storage': 4.22.1 - '@algolia/cache-common': 4.22.1 - '@algolia/cache-in-memory': 4.22.1 - '@algolia/client-account': 4.22.1 - '@algolia/client-analytics': 4.22.1 - '@algolia/client-common': 4.22.1 - '@algolia/client-personalization': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/logger-console': 4.22.1 - '@algolia/requester-browser-xhr': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/requester-node-http': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/cache-browser-local-storage': 4.23.3 + '@algolia/cache-common': 4.23.3 + '@algolia/cache-in-memory': 4.23.3 + '@algolia/client-account': 4.23.3 + '@algolia/client-analytics': 4.23.3 + '@algolia/client-common': 4.23.3 + '@algolia/client-personalization': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/logger-console': 4.23.3 + '@algolia/recommend': 4.23.3 + '@algolia/requester-browser-xhr': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/requester-node-http': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false /ansi-align@3.0.1: @@ -3802,7 +3818,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001600 + caniuse-lite: 1.0.30001610 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -3819,14 +3835,14 @@ packages: - debug dev: true - /babel-loader@9.1.3(@babel/core@7.24.3)(webpack@5.91.0): + /babel-loader@9.1.3(@babel/core@7.24.4)(webpack@5.91.0): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: '@babel/core': ^7.12.0 webpack: '>=5' dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.24.4 find-cache-dir: 4.0.0 schema-utils: 4.2.0 webpack: 5.91.0 @@ -3836,36 +3852,36 @@ packages: dependencies: object.assign: 4.1.5 - /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.3): + /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.4): resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.24.1 - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/compat-data': 7.24.4 + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.3): + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.4): resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) core-js-compat: 3.36.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.3): + /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.4): resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.3 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.3) + '@babel/core': 7.24.4 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.4) transitivePeerDependencies: - supports-color @@ -3962,8 +3978,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.717 + caniuse-lite: 1.0.30001610 + electron-to-chromium: 1.4.737 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -4034,12 +4050,12 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001600 + caniuse-lite: 1.0.30001610 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - /caniuse-lite@1.0.30001600: - resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + /caniuse-lite@1.0.30001610: + resolution: {integrity: sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==} /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -4385,7 +4401,7 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /cosmiconfig@8.3.6(typescript@5.4.3): + /cosmiconfig@8.3.6(typescript@5.4.5): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -4398,7 +4414,7 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.4.3 + typescript: 5.4.5 /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -4427,8 +4443,8 @@ packages: dependencies: postcss: 8.4.38 - /css-loader@6.10.0(webpack@5.91.0): - resolution: {integrity: sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==} + /css-loader@6.11.0(webpack@5.91.0): + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} engines: {node: '>= 12.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -4441,9 +4457,9 @@ packages: dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.38) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.38) - postcss-modules-scope: 3.1.1(postcss@8.4.38) + postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) + postcss-modules-scope: 3.2.0(postcss@8.4.38) postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 semver: 7.6.0 @@ -4650,7 +4666,7 @@ packages: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dev: true /debounce@1.2.1: @@ -4805,17 +4821,17 @@ packages: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} dependencies: - '@leichtgewicht/ip-codec': 2.0.4 + '@leichtgewicht/ip-codec': 2.0.5 - /docusaurus-plugin-redoc@2.0.2(@docusaurus/utils@3.1.1)(core-js@3.36.1)(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8): + /docusaurus-plugin-redoc@2.0.2(@docusaurus/utils@3.2.1)(core-js@3.36.1)(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8): resolution: {integrity: sha512-J4pfu+dvwm1D4qWA6O8FT6EYSw9R1mv9fIXCqKh7aHYD+OU19hj/vQQUdjIbAwTcOkBg+eUYVXvdopwTvUXNcQ==} engines: {node: '>=18'} peerDependencies: '@docusaurus/utils': ^3.0.0 dependencies: - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) '@redocly/openapi-core': 1.10.3 - redoc: 2.1.3(core-js@3.36.1)(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8) + redoc: 2.1.3(core-js@3.36.1)(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8) transitivePeerDependencies: - core-js - encoding @@ -4826,19 +4842,19 @@ packages: - styled-components dev: false - /docusaurus-theme-redoc@2.0.2(@docusaurus/theme-common@3.1.1)(core-js@3.36.1)(react-dom@18.2.0)(react@18.2.0)(webpack@5.91.0): + /docusaurus-theme-redoc@2.0.2(@docusaurus/theme-common@3.2.1)(core-js@3.36.1)(react-dom@18.2.0)(react@18.2.0)(webpack@5.91.0): resolution: {integrity: sha512-qa8svxKCipIvokNGctoQRP3Vz+HTF2Mnwg6xzY/W/LR5TYEIu3nuSvouLLR58uBrHKGzGpto5CEPDq0SvVvDlA==} engines: {node: '>=18'} peerDependencies: '@docusaurus/theme-common': ^3.0.0 webpack: ^5.0.0 dependencies: - '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) + '@docusaurus/theme-common': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) '@redocly/openapi-core': 1.10.3 clsx: 1.2.1 lodash: 4.17.21 - mobx: 6.12.1 - redoc: 2.1.3(core-js@3.36.1)(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8) + mobx: 6.12.3 + redoc: 2.1.3(core-js@3.36.1)(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8) styled-components: 6.1.8(react-dom@18.2.0)(react@18.2.0) webpack: 5.91.0 transitivePeerDependencies: @@ -4883,12 +4899,12 @@ packages: dependencies: domelementtype: 2.3.0 - /dompurify@2.4.9: - resolution: {integrity: sha512-iHtnxYMotKgOTvxIqq677JsKHvCOkAFqj9x8Mek2zdeHW1XjuFKwjpmZeMaXQRQ8AbJZDbcRz/+r1QhwvFtmQg==} + /dompurify@2.5.0: + resolution: {integrity: sha512-5RXhAXSCrKTqt9pSbobT9PVRX+oPpENplTZqCiK1l0ya+ZOzwo9kqsGLbYRsAhzIiLCwKEy99XKSSrqnRTLVcw==} dev: false - /dompurify@3.0.11: - resolution: {integrity: sha512-Fan4uMuyB26gFV3ovPoEoQbxRRPfTu3CvImyZnhGq5fsIEO+gEFLp45ISFt+kQBWsK5ulDdT0oV28jS1UrwQLg==} + /dompurify@3.1.0: + resolution: {integrity: sha512-yoU4rhgPKCo+p5UrWWWNKiIq+ToGqmVVhk0PmMYBK4kRsR3/qhemNFL8f6CFmBd4gMwm3F4T7HBoydP5uY07fA==} dev: true /domutils@2.8.0: @@ -4926,8 +4942,8 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /electron-to-chromium@1.4.717: - resolution: {integrity: sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==} + /electron-to-chromium@1.4.737: + resolution: {integrity: sha512-QvLTxaLHKdy5YxvixAw/FfHq2eWLUL9KvsPjp0aHK1gI5d3EDuDgITkvj0nFO2c6zUY3ZqVAJQiBYyQP9tQpfw==} /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5105,9 +5121,8 @@ packages: astring: 1.8.6 source-map: 0.7.4 - /estree-util-value-to-estree@3.0.1: - resolution: {integrity: sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==} - engines: {node: '>=16.0.0'} + /estree-util-value-to-estree@3.1.1: + resolution: {integrity: sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==} dependencies: '@types/estree': 1.0.5 is-plain-obj: 4.1.0 @@ -5139,7 +5154,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 require-like: 0.1.2 /eventemitter3@4.0.7: @@ -5337,7 +5352,7 @@ packages: resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} dev: false - /fork-ts-checker-webpack-plugin@6.5.3(typescript@5.4.3)(webpack@5.91.0): + /fork-ts-checker-webpack-plugin@6.5.3(typescript@5.4.5)(webpack@5.91.0): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -5364,7 +5379,7 @@ packages: schema-utils: 2.7.0 semver: 7.6.0 tapable: 1.1.3 - typescript: 5.4.3 + typescript: 5.4.5 webpack: 5.91.0 /form-data@4.0.0: @@ -5631,7 +5646,7 @@ packages: '@types/unist': 3.0.2 devlop: 1.1.0 hastscript: 8.0.0 - property-information: 6.4.1 + property-information: 6.5.0 vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 @@ -5672,7 +5687,7 @@ packages: mdast-util-mdx-expression: 2.0.0 mdast-util-mdx-jsx: 3.1.2 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.4 unist-util-position: 5.0.0 @@ -5693,9 +5708,9 @@ packages: mdast-util-mdx-expression: 2.0.0 mdast-util-mdx-jsx: 3.1.2 mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 - style-to-object: 1.0.5 + style-to-object: 1.0.6 unist-util-position: 5.0.0 vfile-message: 4.0.2 transitivePeerDependencies: @@ -5707,7 +5722,7 @@ packages: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -5723,7 +5738,7 @@ packages: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.4.1 + property-information: 6.5.0 space-separated-tokens: 2.0.2 /he@1.2.0: @@ -5733,7 +5748,7 @@ packages: /history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.3 @@ -5777,7 +5792,7 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.29.2 + terser: 5.30.3 /html-minifier-terser@7.2.0: resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} @@ -5790,7 +5805,7 @@ packages: entities: 4.5.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.29.2 + terser: 5.30.3 /html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} @@ -5866,7 +5881,7 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -5915,7 +5930,7 @@ packages: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -6009,8 +6024,8 @@ packages: /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - /inline-style-parser@0.2.2: - resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + /inline-style-parser@0.2.3: + resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} @@ -6132,10 +6147,6 @@ packages: dependencies: isobject: 3.0.1 - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true @@ -6183,12 +6194,12 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - /isomorphic-dompurify@2.6.0: - resolution: {integrity: sha512-hTH3xazYEhs+cJu2uLaw/mPPvTefW6ljyRt2JiQ3OBoQ7+3YpgZOLmeBrDrGS/tnDQx1BuwwZcl6wEsYIVK4uQ==} + /isomorphic-dompurify@2.7.0: + resolution: {integrity: sha512-0FTlXP/gEEWW+O/sXaO9yZ4bgegrHnOqzbdCNAMeO2KYIOVMAcqVIo+uTcWYd1+DmI+nV58vUmNW03nauoKn2w==} engines: {node: '>=18'} dependencies: '@types/dompurify': 3.0.5 - dompurify: 3.0.11 + dompurify: 3.1.0 jsdom: 24.0.0 transitivePeerDependencies: - bufferutil @@ -6202,7 +6213,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.11.30 + '@types/node': 20.12.7 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -6212,7 +6223,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -6220,7 +6231,7 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.11.30 + '@types/node': 20.12.7 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -6229,8 +6240,8 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true - /joi@17.12.2: - resolution: {integrity: sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==} + /joi@17.12.3: + resolution: {integrity: sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -6496,7 +6507,7 @@ packages: mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 - stringify-entities: 4.0.3 + stringify-entities: 4.0.4 unist-util-visit-parents: 6.0.1 transitivePeerDependencies: - supports-color @@ -6626,7 +6637,7 @@ packages: mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 - stringify-entities: 4.0.3 + stringify-entities: 4.0.4 unist-util-remove-position: 5.0.0 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 @@ -7135,7 +7146,7 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /mobx-react-lite@3.4.3(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0): + /mobx-react-lite@3.4.3(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==} peerDependencies: mobx: ^6.1.0 @@ -7148,12 +7159,12 @@ packages: react-native: optional: true dependencies: - mobx: 6.12.1 + mobx: 6.12.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /mobx-react@7.6.0(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0): + /mobx-react@7.6.0(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==} peerDependencies: mobx: ^6.1.0 @@ -7166,14 +7177,14 @@ packages: react-native: optional: true dependencies: - mobx: 6.12.1 - mobx-react-lite: 3.4.3(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0) + mobx: 6.12.3 + mobx-react-lite: 3.4.3(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /mobx@6.12.1: - resolution: {integrity: sha512-HN5/fmWCnePVI4u3Y487x3G0LIQ+qnQjowylhVxXPvBmbwottKm8R7GrsYAqljzekZUj+LoBcAUp3l8/3EPCGQ==} + /mobx@6.12.3: + resolution: {integrity: sha512-c8NKkO4R2lShkSXZ2Ongj1ycjugjzFFo/UswHBnS62y07DMcTc9Rvo03/3nRyszIvwPNljlkd4S828zIBv/piw==} dev: false /mrmime@2.0.0: @@ -7597,7 +7608,7 @@ packages: resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 dev: false /postcss-calc@8.2.4(postcss@8.4.38): @@ -7672,14 +7683,14 @@ packages: postcss: 8.4.38 postcss-selector-parser: 6.0.16 - /postcss-loader@7.3.4(postcss@8.4.38)(typescript@5.4.3)(webpack@5.91.0): + /postcss-loader@7.3.4(postcss@8.4.38)(typescript@5.4.5)(webpack@5.91.0): resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} engines: {node: '>= 14.15.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 dependencies: - cosmiconfig: 8.3.6(typescript@5.4.3) + cosmiconfig: 8.3.6(typescript@5.4.5) jiti: 1.21.0 postcss: 8.4.38 semver: 7.6.0 @@ -7759,16 +7770,16 @@ packages: postcss: 8.4.38 postcss-selector-parser: 6.0.16 - /postcss-modules-extract-imports@3.0.0(postcss@8.4.38): - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + /postcss-modules-extract-imports@3.1.0(postcss@8.4.38): + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: postcss: 8.4.38 - /postcss-modules-local-by-default@4.0.4(postcss@8.4.38): - resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} + /postcss-modules-local-by-default@4.0.5(postcss@8.4.38): + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 @@ -7778,8 +7789,8 @@ packages: postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 - /postcss-modules-scope@3.1.1(postcss@8.4.38): - resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} + /postcss-modules-scope@3.2.0(postcss@8.4.38): + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 @@ -8019,8 +8030,8 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 - /property-information@6.4.1: - resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + /property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -8112,7 +8123,7 @@ packages: minimist: 1.2.8 strip-json-comments: 2.0.1 - /react-dev-utils@12.0.1(typescript@5.4.3)(webpack@5.91.0): + /react-dev-utils@12.0.1(typescript@5.4.5)(webpack@5.91.0): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -8131,7 +8142,7 @@ packages: 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.4.3)(webpack@5.91.0) + fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.4.5)(webpack@5.91.0) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -8146,7 +8157,7 @@ packages: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - typescript: 5.4.3 + typescript: 5.4.5 webpack: 5.91.0 transitivePeerDependencies: - eslint @@ -8174,7 +8185,7 @@ packages: react: ^16.6.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 invariant: 2.2.4 prop-types: 15.8.1 react: 18.2.0 @@ -8213,7 +8224,7 @@ packages: react-loadable: '*' webpack: '>=4.41.1 || 5.x' dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) webpack: 5.91.0 @@ -8223,7 +8234,7 @@ packages: react: '>=15' react-router: '>=5' dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 react: 18.2.0 react-router: 5.3.4(react@18.2.0) @@ -8232,7 +8243,7 @@ packages: peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -8246,7 +8257,7 @@ packages: peerDependencies: react: '>=15' dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 @@ -8313,7 +8324,7 @@ packages: dependencies: minimatch: 3.1.2 - /redoc@2.1.3(core-js@3.36.1)(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8): + /redoc@2.1.3(core-js@3.36.1)(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8): resolution: {integrity: sha512-d7F9qLLxaiFW4GC03VkwlX9wuRIpx9aiIIf3o6mzMnqPfhxrn2IRKGndrkJeVdItgCfmg9jXZiFEowm60f1meQ==} engines: {node: '>=6.9', npm: '>=3.0.0'} peerDependencies: @@ -8327,14 +8338,14 @@ packages: classnames: 2.5.1 core-js: 3.36.1 decko: 1.2.0 - dompurify: 2.4.9 + dompurify: 2.5.0 eventemitter3: 4.0.7 json-pointer: 0.6.2 lunr: 2.3.9 mark.js: 8.11.1 marked: 4.3.0 - mobx: 6.12.1 - mobx-react: 7.6.0(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0) + mobx: 6.12.3 + mobx-react: 7.6.0(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0) openapi-sampler: 1.4.0 path-browserify: 1.0.1 perfect-scrollbar: 1.5.5 @@ -8354,17 +8365,17 @@ packages: - react-native dev: false - /redocusaurus@2.0.2(@docusaurus/theme-common@3.1.1)(@docusaurus/utils@3.1.1)(core-js@3.36.1)(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8)(webpack@5.91.0): + /redocusaurus@2.0.2(@docusaurus/theme-common@3.2.1)(@docusaurus/utils@3.2.1)(core-js@3.36.1)(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8)(webpack@5.91.0): resolution: {integrity: sha512-o71XY24IkqCWVUF39UpVbklvKilbI5LfqPPeD5yhuaME87agsIHpRNdvifdPIK0oAQog4RMjDM+qMRqKUB414A==} engines: {node: '>=14'} peerDependencies: '@docusaurus/theme-common': ^3.0.0 '@docusaurus/utils': ^3.0.0 dependencies: - '@docusaurus/theme-common': 3.1.1(@docusaurus/types@3.1.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) - '@docusaurus/utils': 3.1.1(@docusaurus/types@3.1.1) - docusaurus-plugin-redoc: 2.0.2(@docusaurus/utils@3.1.1)(core-js@3.36.1)(mobx@6.12.1)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8) - docusaurus-theme-redoc: 2.0.2(@docusaurus/theme-common@3.1.1)(core-js@3.36.1)(react-dom@18.2.0)(react@18.2.0)(webpack@5.91.0) + '@docusaurus/theme-common': 3.2.1(@docusaurus/types@3.2.1)(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.5) + '@docusaurus/utils': 3.2.1(@docusaurus/types@3.2.1) + docusaurus-plugin-redoc: 2.0.2(@docusaurus/utils@3.2.1)(core-js@3.36.1)(mobx@6.12.3)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.8) + docusaurus-theme-redoc: 2.0.2(@docusaurus/theme-common@3.2.1)(core-js@3.36.1)(react-dom@18.2.0)(react@18.2.0)(webpack@5.91.0) transitivePeerDependencies: - core-js - encoding @@ -8395,7 +8406,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.1 + '@babel/runtime': 7.24.4 /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} @@ -9016,8 +9027,8 @@ packages: dependencies: safe-buffer: 5.2.1 - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + /stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 @@ -9063,10 +9074,10 @@ packages: dependencies: inline-style-parser: 0.1.1 - /style-to-object@1.0.5: - resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + /style-to-object@1.0.6: + resolution: {integrity: sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==} dependencies: - inline-style-parser: 0.2.2 + inline-style-parser: 0.2.3 /styled-components@6.1.8(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} @@ -9205,11 +9216,11 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.29.2 + terser: 5.30.3 webpack: 5.91.0 - /terser@5.29.2: - resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==} + /terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -9307,8 +9318,8 @@ packages: dependencies: is-typedarray: 1.0.0 - /typescript@5.4.3: - resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true @@ -9543,8 +9554,8 @@ packages: engines: {node: '>=12'} dev: true - /webpack-bundle-analyzer@4.10.1: - resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} + /webpack-bundle-analyzer@4.10.2: + resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} engines: {node: '>= 10.13.0'} hasBin: true dependencies: @@ -9556,7 +9567,6 @@ packages: escape-string-regexp: 4.0.0 gzip-size: 6.0.0 html-escaper: 2.0.2 - is-plain-object: 5.0.0 opener: 1.5.2 picocolors: 1.0.0 sirv: 2.0.4 @@ -9595,7 +9605,7 @@ packages: '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.21 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.5 + '@types/serve-static': 1.15.7 '@types/sockjs': 0.3.36 '@types/ws': 8.5.10 ansi-html-community: 0.0.8 diff --git a/go.mod b/go.mod index 6d19445c7..39b9c2ed5 100644 --- a/go.mod +++ b/go.mod @@ -57,11 +57,11 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 github.com/zalando/go-keyring v0.2.4 go.uber.org/multierr v1.11.0 - golang.org/x/crypto v0.21.0 - golang.org/x/net v0.22.0 + golang.org/x/crypto v0.22.0 + golang.org/x/net v0.24.0 golang.org/x/oauth2 v0.18.0 golang.org/x/sync v0.6.0 - golang.org/x/term v0.18.0 + golang.org/x/term v0.19.0 golang.org/x/text v0.14.0 google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.33.0 @@ -170,7 +170,7 @@ require ( go.uber.org/zap v1.26.0 // indirect golang.org/x/arch v0.6.0 // indirect golang.org/x/mod v0.14.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.16.1 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/go.sum b/go.sum index f1b7585a9..6a6fe5978 100644 --- a/go.sum +++ b/go.sum @@ -542,6 +542,8 @@ golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58 golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -575,6 +577,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= @@ -621,6 +625,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.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= @@ -629,6 +635,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= 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= diff --git a/pipeline/rpc/proto/generate.go b/pipeline/rpc/proto/generate.go index a0f827ec1..8a3ce2ccf 100644 --- a/pipeline/rpc/proto/generate.go +++ b/pipeline/rpc/proto/generate.go @@ -16,8 +16,3 @@ package proto //go:generate protoc --go_out=paths=source_relative:. woodpecker.proto //go:generate protoc --go-grpc_out=paths=source_relative:. woodpecker.proto - -// install protoc: https://grpc.io/docs/protoc-installation/ -// and get needed binary's: -// go install google.golang.org/protobuf/cmd/protoc-gen-go@latest -// go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest diff --git a/pipeline/rpc/proto/woodpecker.pb.go b/pipeline/rpc/proto/woodpecker.pb.go index f49b64d33..c5cf5f47d 100644 --- a/pipeline/rpc/proto/woodpecker.pb.go +++ b/pipeline/rpc/proto/woodpecker.pb.go @@ -15,8 +15,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.32.0 -// protoc v4.25.1 +// protoc-gen-go v1.33.0 +// protoc v4.24.4 // source: woodpecker.proto package proto diff --git a/pipeline/rpc/proto/woodpecker_grpc.pb.go b/pipeline/rpc/proto/woodpecker_grpc.pb.go index 837ce74e0..f591f4dfe 100644 --- a/pipeline/rpc/proto/woodpecker_grpc.pb.go +++ b/pipeline/rpc/proto/woodpecker_grpc.pb.go @@ -1,22 +1,7 @@ -// Copyright 2021 Woodpecker Authors -// Copyright 2011 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. - // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v4.24.4 // source: woodpecker.proto package proto @@ -74,7 +59,7 @@ func NewWoodpeckerClient(cc grpc.ClientConnInterface) WoodpeckerClient { func (c *woodpeckerClient) Version(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*VersionResponse, error) { out := new(VersionResponse) - err := c.cc.Invoke(ctx, Woodpecker_Version_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/Version", in, out, opts...) if err != nil { return nil, err } @@ -83,7 +68,7 @@ func (c *woodpeckerClient) Version(ctx context.Context, in *Empty, opts ...grpc. func (c *woodpeckerClient) Next(ctx context.Context, in *NextRequest, opts ...grpc.CallOption) (*NextResponse, error) { out := new(NextResponse) - err := c.cc.Invoke(ctx, Woodpecker_Next_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/Next", in, out, opts...) if err != nil { return nil, err } @@ -92,7 +77,7 @@ func (c *woodpeckerClient) Next(ctx context.Context, in *NextRequest, opts ...gr func (c *woodpeckerClient) Init(ctx context.Context, in *InitRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, Woodpecker_Init_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/Init", in, out, opts...) if err != nil { return nil, err } @@ -101,7 +86,7 @@ func (c *woodpeckerClient) Init(ctx context.Context, in *InitRequest, opts ...gr func (c *woodpeckerClient) Wait(ctx context.Context, in *WaitRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, Woodpecker_Wait_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/Wait", in, out, opts...) if err != nil { return nil, err } @@ -110,7 +95,7 @@ func (c *woodpeckerClient) Wait(ctx context.Context, in *WaitRequest, opts ...gr func (c *woodpeckerClient) Done(ctx context.Context, in *DoneRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, Woodpecker_Done_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/Done", in, out, opts...) if err != nil { return nil, err } @@ -119,7 +104,7 @@ func (c *woodpeckerClient) Done(ctx context.Context, in *DoneRequest, opts ...gr func (c *woodpeckerClient) Extend(ctx context.Context, in *ExtendRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, Woodpecker_Extend_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/Extend", in, out, opts...) if err != nil { return nil, err } @@ -128,7 +113,7 @@ func (c *woodpeckerClient) Extend(ctx context.Context, in *ExtendRequest, opts . func (c *woodpeckerClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, Woodpecker_Update_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/Update", in, out, opts...) if err != nil { return nil, err } @@ -137,7 +122,7 @@ func (c *woodpeckerClient) Update(ctx context.Context, in *UpdateRequest, opts . func (c *woodpeckerClient) Log(ctx context.Context, in *LogRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, Woodpecker_Log_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/Log", in, out, opts...) if err != nil { return nil, err } @@ -146,7 +131,7 @@ func (c *woodpeckerClient) Log(ctx context.Context, in *LogRequest, opts ...grpc func (c *woodpeckerClient) RegisterAgent(ctx context.Context, in *RegisterAgentRequest, opts ...grpc.CallOption) (*RegisterAgentResponse, error) { out := new(RegisterAgentResponse) - err := c.cc.Invoke(ctx, Woodpecker_RegisterAgent_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/RegisterAgent", in, out, opts...) if err != nil { return nil, err } @@ -164,7 +149,7 @@ func (c *woodpeckerClient) UnregisterAgent(ctx context.Context, in *Empty, opts func (c *woodpeckerClient) ReportHealth(ctx context.Context, in *ReportHealthRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, Woodpecker_ReportHealth_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.Woodpecker/ReportHealth", in, out, opts...) if err != nil { return nil, err } @@ -249,7 +234,7 @@ func _Woodpecker_Version_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_Version_FullMethodName, + FullMethod: "/proto.Woodpecker/Version", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).Version(ctx, req.(*Empty)) @@ -267,7 +252,7 @@ func _Woodpecker_Next_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_Next_FullMethodName, + FullMethod: "/proto.Woodpecker/Next", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).Next(ctx, req.(*NextRequest)) @@ -285,7 +270,7 @@ func _Woodpecker_Init_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_Init_FullMethodName, + FullMethod: "/proto.Woodpecker/Init", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).Init(ctx, req.(*InitRequest)) @@ -303,7 +288,7 @@ func _Woodpecker_Wait_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_Wait_FullMethodName, + FullMethod: "/proto.Woodpecker/Wait", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).Wait(ctx, req.(*WaitRequest)) @@ -321,7 +306,7 @@ func _Woodpecker_Done_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_Done_FullMethodName, + FullMethod: "/proto.Woodpecker/Done", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).Done(ctx, req.(*DoneRequest)) @@ -339,7 +324,7 @@ func _Woodpecker_Extend_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_Extend_FullMethodName, + FullMethod: "/proto.Woodpecker/Extend", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).Extend(ctx, req.(*ExtendRequest)) @@ -357,7 +342,7 @@ func _Woodpecker_Update_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_Update_FullMethodName, + FullMethod: "/proto.Woodpecker/Update", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).Update(ctx, req.(*UpdateRequest)) @@ -375,7 +360,7 @@ func _Woodpecker_Log_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_Log_FullMethodName, + FullMethod: "/proto.Woodpecker/Log", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).Log(ctx, req.(*LogRequest)) @@ -393,7 +378,7 @@ func _Woodpecker_RegisterAgent_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_RegisterAgent_FullMethodName, + FullMethod: "/proto.Woodpecker/RegisterAgent", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).RegisterAgent(ctx, req.(*RegisterAgentRequest)) @@ -429,7 +414,7 @@ func _Woodpecker_ReportHealth_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Woodpecker_ReportHealth_FullMethodName, + FullMethod: "/proto.Woodpecker/ReportHealth", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerServer).ReportHealth(ctx, req.(*ReportHealthRequest)) @@ -493,10 +478,6 @@ var Woodpecker_ServiceDesc = grpc.ServiceDesc{ Metadata: "woodpecker.proto", } -const ( - WoodpeckerAuth_Auth_FullMethodName = "/proto.WoodpeckerAuth/Auth" -) - // WoodpeckerAuthClient is the client API for WoodpeckerAuth service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -514,7 +495,7 @@ func NewWoodpeckerAuthClient(cc grpc.ClientConnInterface) WoodpeckerAuthClient { func (c *woodpeckerAuthClient) Auth(ctx context.Context, in *AuthRequest, opts ...grpc.CallOption) (*AuthResponse, error) { out := new(AuthResponse) - err := c.cc.Invoke(ctx, WoodpeckerAuth_Auth_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/proto.WoodpeckerAuth/Auth", in, out, opts...) if err != nil { return nil, err } @@ -559,7 +540,7 @@ func _WoodpeckerAuth_Auth_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: WoodpeckerAuth_Auth_FullMethodName, + FullMethod: "/proto.WoodpeckerAuth/Auth", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(WoodpeckerAuthServer).Auth(ctx, req.(*AuthRequest)) diff --git a/server/api/cron.go b/server/api/cron.go index c7bcb6371..7a9f797fc 100644 --- a/server/api/cron.go +++ b/server/api/cron.go @@ -20,6 +20,7 @@ import ( "time" "github.com/gin-gonic/gin" + "github.com/rs/zerolog/log" "go.woodpecker-ci.org/woodpecker/v2/server" cronScheduler "go.woodpecker-ci.org/woodpecker/v2/server/cron" @@ -80,7 +81,7 @@ func RunCron(c *gin.Context) { return } - repo, newPipeline, err := cronScheduler.CreatePipeline(c, _store, server.Config.Services.Forge, cron) + repo, newPipeline, err := cronScheduler.CreatePipeline(c, _store, cron) if err != nil { c.String(http.StatusInternalServerError, "Error creating pipeline for cron %q. %s", id, err) return @@ -109,7 +110,12 @@ func PostCron(c *gin.Context) { repo := session.Repo(c) user := session.User(c) _store := store.FromContext(c) - forge := server.Config.Services.Forge + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } in := new(model.Cron) if err := c.Bind(in); err != nil { @@ -137,7 +143,7 @@ func PostCron(c *gin.Context) { if in.Branch != "" { // check if branch exists on forge - _, err := forge.BranchHead(c, user, repo, in.Branch) + _, err := _forge.BranchHead(c, user, repo, in.Branch) if err != nil { c.String(http.StatusBadRequest, "Error inserting cron. branch not resolved: %s", err) return @@ -166,7 +172,12 @@ func PatchCron(c *gin.Context) { repo := session.Repo(c) user := session.User(c) _store := store.FromContext(c) - forge := server.Config.Services.Forge + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } id, err := strconv.ParseInt(c.Param("cron"), 10, 64) if err != nil { @@ -188,7 +199,7 @@ func PatchCron(c *gin.Context) { } if in.Branch != "" { // check if branch exists on forge - _, err := forge.BranchHead(c, user, repo, in.Branch) + _, err := _forge.BranchHead(c, user, repo, in.Branch) if err != nil { c.String(http.StatusBadRequest, "Error inserting cron. branch not resolved: %s", err) return diff --git a/server/api/helper.go b/server/api/helper.go index 51646e370..8b621487b 100644 --- a/server/api/helper.go +++ b/server/api/helper.go @@ -19,6 +19,7 @@ import ( "net/http" "github.com/gin-gonic/gin" + "github.com/rs/zerolog/log" "go.woodpecker-ci.org/woodpecker/v2/server" "go.woodpecker-ci.org/woodpecker/v2/server/forge" @@ -54,7 +55,12 @@ func handleDBError(c *gin.Context, err error) { // If the forge has a refresh token, the current access token may be stale. // Therefore, we should refresh prior to dispatching the job. func refreshUserToken(c *gin.Context, user *model.User) { - _forge := server.Config.Services.Forge _store := store.FromContext(c) + _forge, err := server.Config.Services.Manager.ForgeFromUser(user) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from user") + c.AbortWithStatus(http.StatusInternalServerError) + return + } forge.Refresh(c, _forge, _store, user) } diff --git a/server/api/hook.go b/server/api/hook.go index 4318ae480..b2e7251ba 100644 --- a/server/api/hook.go +++ b/server/api/hook.go @@ -104,7 +104,13 @@ func BlockTilQueueHasRunningItem(c *gin.Context) { // @Param hook body object true "the webhook payload; forge is automatically detected" func PostHook(c *gin.Context) { _store := store.FromContext(c) - _forge := server.Config.Services.Forge + + _forge, err := server.Config.Services.Manager.ForgeMain() // TODO: get the forge for the specific repo somehow + if err != nil { + log.Error().Err(err).Msg("Cannot get main forge") + c.AbortWithStatus(http.StatusInternalServerError) + return + } // // 1. Parse webhook diff --git a/server/api/login.go b/server/api/login.go index 4daea4a57..349861ce1 100644 --- a/server/api/login.go +++ b/server/api/login.go @@ -43,7 +43,12 @@ func HandleLogin(c *gin.Context) { func HandleAuth(c *gin.Context) { _store := store.FromContext(c) - _forge := server.Config.Services.Forge + _forge, err := server.Config.Services.Manager.ForgeMain() + if err != nil { + _ = c.AbortWithError(http.StatusInternalServerError, err) + return + } + forgeID := int64(1) // TODO: replace with forge id when multiple forges are supported // when dealing with redirects, we may need to adjust the content type. I // cannot, however, remember why, so need to revisit this line. @@ -68,12 +73,12 @@ func HandleAuth(c *gin.Context) { // get the user from the database u, err := _store.GetUserRemoteID(tmpuser.ForgeRemoteID, tmpuser.Login) - if err != nil { - if !errors.Is(err, types.RecordNotExist) { - _ = c.AbortWithError(http.StatusInternalServerError, err) - return - } + if err != nil && !errors.Is(err, types.RecordNotExist) { + _ = c.AbortWithError(http.StatusInternalServerError, err) + return + } + if errors.Is(err, types.RecordNotExist) { // if self-registration is disabled we should return a not authorized error if !server.Config.Permissions.Open && !server.Config.Permissions.Admins.IsAdmin(tmpuser) { log.Error().Msgf("cannot register %s. registration closed", tmpuser.Login) @@ -100,6 +105,7 @@ func HandleAuth(c *gin.Context) { Secret: tmpuser.Secret, Email: tmpuser.Email, Avatar: tmpuser.Avatar, + ForgeID: forgeID, Hash: base32.StdEncoding.EncodeToString( securecookie.GenerateRandomKey(32), ), @@ -129,6 +135,7 @@ func HandleAuth(c *gin.Context) { Name: u.Login, IsUser: true, Private: false, + ForgeID: u.ForgeID, } if err := _store.OrgCreate(org); err != nil { log.Error().Err(err).Msgf("on user creation, could create org for user") @@ -228,14 +235,21 @@ func GetLogout(c *gin.Context) { func GetLoginToken(c *gin.Context) { _store := store.FromContext(c) + _forge, err := server.Config.Services.Manager.ForgeMain() // TODO: get selected forge from auth request + if err != nil { + log.Error().Err(err).Msg("Cannot get main forge") + c.AbortWithStatus(http.StatusInternalServerError) + return + } + in := &tokenPayload{} - err := c.Bind(in) + err = c.Bind(in) if err != nil { _ = c.AbortWithError(http.StatusBadRequest, err) return } - login, err := server.Config.Services.Forge.Auth(c, in.Access, in.Refresh) + login, err := _forge.Auth(c, in.Access, in.Refresh) if err != nil { _ = c.AbortWithError(http.StatusUnauthorized, err) return diff --git a/server/api/org.go b/server/api/org.go index 09d677221..c30d55ebe 100644 --- a/server/api/org.go +++ b/server/api/org.go @@ -68,6 +68,13 @@ func GetOrgPermissions(c *gin.Context) { user := session.User(c) _store := store.FromContext(c) + _forge, err := server.Config.Services.Manager.ForgeFromUser(user) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from user") + c.AbortWithStatus(http.StatusInternalServerError) + return + } + orgID, err := strconv.ParseInt(c.Param("org_id"), 10, 64) if err != nil { c.String(http.StatusBadRequest, "Error parsing org id. %s", err) @@ -96,7 +103,7 @@ func GetOrgPermissions(c *gin.Context) { return } - perm, err := server.Config.Services.Membership.Get(c, user, org.Name) + 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) return @@ -116,6 +123,13 @@ func GetOrgPermissions(c *gin.Context) { // @Param org_full_name path string true "the organizations full-name / slug" func LookupOrg(c *gin.Context) { _store := store.FromContext(c) + user := session.User(c) + _forge, err := server.Config.Services.Manager.ForgeFromUser(user) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from user") + c.AbortWithStatus(http.StatusInternalServerError) + return + } orgFullName := strings.TrimLeft(c.Param("org_full_name"), "/") @@ -137,7 +151,7 @@ func LookupOrg(c *gin.Context) { c.AbortWithStatus(http.StatusNotFound) return } else if !user.Admin { - perm, err := server.Config.Services.Membership.Get(c, user, org.Name) + perm, err := server.Config.Services.Membership.Get(c, _forge, user, org.Name) if err != nil { log.Error().Err(err).Msg("failed to check membership") c.Status(http.StatusInternalServerError) diff --git a/server/api/pipeline.go b/server/api/pipeline.go index 0c5cdc5e1..8803ab95f 100644 --- a/server/api/pipeline.go +++ b/server/api/pipeline.go @@ -27,6 +27,7 @@ import ( "time" "github.com/gin-gonic/gin" + "github.com/rs/zerolog/log" "go.woodpecker-ci.org/woodpecker/v2/server" "go.woodpecker-ci.org/woodpecker/v2/server/model" @@ -48,10 +49,16 @@ import ( func CreatePipeline(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } // parse create options var opts model.PipelineOptions - err := json.NewDecoder(c.Request.Body).Decode(&opts) + err = json.NewDecoder(c.Request.Body).Decode(&opts) if err != nil { _ = c.AbortWithError(http.StatusBadRequest, err) return @@ -59,7 +66,7 @@ func CreatePipeline(c *gin.Context) { user := session.User(c) - lastCommit, _ := server.Config.Services.Forge.BranchHead(c, user, repo, opts.Branch) + lastCommit, _ := _forge.BranchHead(c, user, repo, opts.Branch) tmpPipeline := createTmpPipeline(model.EventManual, lastCommit, user, &opts) @@ -332,6 +339,13 @@ func CancelPipeline(c *gin.Context) { _store := store.FromContext(c) repo := session.Repo(c) user := session.User(c) + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } + num, _ := strconv.ParseInt(c.Params.ByName("number"), 10, 64) pl, err := _store.GetPipelineNumber(repo, num) @@ -340,7 +354,7 @@ func CancelPipeline(c *gin.Context) { return } - if err := pipeline.Cancel(c, _store, repo, user, pl); err != nil { + if err := pipeline.Cancel(c, _forge, _store, repo, user, pl); err != nil { handlePipelineErr(c, err) } else { c.Status(http.StatusNoContent) diff --git a/server/api/repo.go b/server/api/repo.go index e9c4c3138..6d03dcede 100644 --- a/server/api/repo.go +++ b/server/api/repo.go @@ -45,9 +45,14 @@ import ( // @Param Authorization header string true "Insert your personal access token" default(Bearer ) // @Param forge_remote_id query string true "the id of a repository at the forge" func PostRepo(c *gin.Context) { - forge := server.Config.Services.Forge _store := store.FromContext(c) user := session.User(c) + _forge, err := server.Config.Services.Manager.ForgeFromUser(user) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from user") + c.AbortWithStatus(http.StatusInternalServerError) + return + } forgeRemoteID := model.ForgeRemoteID(c.Query("forge_remote_id")) if !forgeRemoteID.IsValid() { @@ -67,7 +72,7 @@ func PostRepo(c *gin.Context) { return } - from, err := forge.Repo(c, user, forgeRemoteID, "", "") + from, err := _forge.Repo(c, user, forgeRemoteID, "", "") if err != nil { c.String(http.StatusInternalServerError, "Could not fetch repository from forge.") return @@ -138,7 +143,7 @@ func PostRepo(c *gin.Context) { // create an org if it doesn't exist yet if errors.Is(err, types.RecordNotExist) { - org, err = forge.Org(c, user, repo.Owner) + org, err = _forge.Org(c, user, repo.Owner) if err != nil { msg := "could not fetch organization from forge." log.Error().Err(err).Msg(msg) @@ -146,6 +151,7 @@ func PostRepo(c *gin.Context) { return } + org.ForgeID = user.ForgeID err = _store.OrgCreate(org) if err != nil { msg := "could not create organization in store." @@ -157,7 +163,7 @@ func PostRepo(c *gin.Context) { repo.OrgID = org.ID - err = forge.Activate(c, user, repo, hookURL) + err = _forge.Activate(c, user, repo, hookURL) if err != nil { msg := "could not create webhook in forge." log.Error().Err(err).Msg(msg) @@ -168,6 +174,7 @@ func PostRepo(c *gin.Context) { if enabledOnce { err = _store.UpdateRepo(repo) } else { + repo.ForgeID = user.ForgeID // TODO: allow to use other connected forges of the user err = _store.CreateRepo(repo) } if err != nil { @@ -342,9 +349,14 @@ func GetRepoPermissions(c *gin.Context) { func GetRepoBranches(c *gin.Context) { repo := session.Repo(c) user := session.User(c) - f := server.Config.Services.Forge + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } - branches, err := f.Branches(c, user, repo, session.Pagination(c)) + branches, err := _forge.Branches(c, user, repo, session.Pagination(c)) if err != nil { _ = c.AbortWithError(http.StatusInternalServerError, err) return @@ -367,9 +379,14 @@ func GetRepoBranches(c *gin.Context) { func GetRepoPullRequests(c *gin.Context) { repo := session.Repo(c) user := session.User(c) - f := server.Config.Services.Forge + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } - prs, err := f.PullRequests(c, user, repo, session.Pagination(c)) + prs, err := _forge.PullRequests(c, user, repo, session.Pagination(c)) if err != nil { _ = c.AbortWithError(http.StatusInternalServerError, err) return @@ -390,9 +407,14 @@ func GetRepoPullRequests(c *gin.Context) { func DeleteRepo(c *gin.Context) { remove, _ := strconv.ParseBool(c.Query("remove")) _store := store.FromContext(c) - repo := session.Repo(c) user := session.User(c) + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } repo.IsActive = false repo.UserID = 0 @@ -409,7 +431,7 @@ func DeleteRepo(c *gin.Context) { } } - if err := server.Config.Services.Forge.Deactivate(c, user, repo, server.Config.Server.WebhookHost); err != nil { + if err := _forge.Deactivate(c, user, repo, server.Config.Server.WebhookHost); err != nil { _ = c.AbortWithError(http.StatusInternalServerError, err) return } @@ -445,10 +467,15 @@ func RepairRepo(c *gin.Context) { // @Param repo_id path int true "the repository id" // @Param to query string true "the username to move the repository to" func MoveRepo(c *gin.Context) { - forge := server.Config.Services.Forge _store := store.FromContext(c) repo := session.Repo(c) user := session.User(c) + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } to, exists := c.GetQuery("to") if !exists { @@ -463,7 +490,7 @@ func MoveRepo(c *gin.Context) { return } - from, err := forge.Repo(c, user, "", owner, name) + from, err := _forge.Repo(c, user, "", owner, name) if err != nil { _ = c.AbortWithError(http.StatusInternalServerError, err) return @@ -508,10 +535,10 @@ func MoveRepo(c *gin.Context) { sig, ) - if err := forge.Deactivate(c, user, repo, host); err != nil { + if err := _forge.Deactivate(c, user, repo, host); err != nil { log.Trace().Err(err).Msgf("deactivate repo '%s' for move to activate later, got an error", repo.FullName) } - if err := forge.Activate(c, user, repo, hookURL); err != nil { + if err := _forge.Activate(c, user, repo, hookURL); err != nil { c.String(http.StatusInternalServerError, err.Error()) return } @@ -571,8 +598,13 @@ func RepairAllRepos(c *gin.Context) { } func repairRepo(c *gin.Context, repo *model.Repo, withPerms, skipOnErr bool) { - forge := server.Config.Services.Forge _store := store.FromContext(c) + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } user, err := _store.GetUser(repo.UserID) if err != nil { @@ -603,7 +635,7 @@ func repairRepo(c *gin.Context, repo *model.Repo, withPerms, skipOnErr bool) { sig, ) - from, err := forge.Repo(c, user, repo.ForgeRemoteID, repo.Owner, repo.Name) + from, err := _forge.Repo(c, user, repo.ForgeRemoteID, repo.Owner, repo.Name) if err != nil { log.Error().Err(err).Msgf("get repo '%s/%s' from forge", repo.Owner, repo.Name) if !skipOnErr { @@ -636,10 +668,10 @@ func repairRepo(c *gin.Context, repo *model.Repo, withPerms, skipOnErr bool) { } } - if err := forge.Deactivate(c, user, repo, host); err != nil { + if err := _forge.Deactivate(c, user, repo, host); err != nil { log.Trace().Err(err).Msgf("deactivate repo '%s' to repair failed", repo.FullName) } - if err := forge.Activate(c, user, repo, hookURL); err != nil { + if err := _forge.Activate(c, user, repo, hookURL); err != nil { c.String(http.StatusInternalServerError, err.Error()) return } diff --git a/server/api/user.go b/server/api/user.go index f33d4d32e..d24849bf3 100644 --- a/server/api/user.go +++ b/server/api/user.go @@ -21,6 +21,7 @@ import ( "github.com/gin-gonic/gin" "github.com/gorilla/securecookie" + "github.com/rs/zerolog/log" "go.woodpecker-ci.org/woodpecker/v2/server" "go.woodpecker-ci.org/woodpecker/v2/server/model" @@ -86,9 +87,14 @@ func GetFeed(c *gin.Context) { // @Param all query bool false "query all repos, including inactive ones" func GetRepos(c *gin.Context) { _store := store.FromContext(c) - _forge := server.Config.Services.Forge - user := session.User(c) + _forge, err := server.Config.Services.Manager.ForgeFromUser(user) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from user") + c.AbortWithStatus(http.StatusInternalServerError) + return + } + all, _ := strconv.ParseBool(c.Query("all")) if all { diff --git a/server/api/users.go b/server/api/users.go index 30fd8278f..c35339eef 100644 --- a/server/api/users.go +++ b/server/api/users.go @@ -132,6 +132,8 @@ func PostUser(c *gin.Context) { Hash: base32.StdEncoding.EncodeToString( securecookie.GenerateRandomKey(32), ), + ForgeID: 1, // TODO: replace with forge id when multiple forges are supported + ForgeRemoteID: model.ForgeRemoteID("0"), // TODO: search for the user in the forge and get the remote id } if err = user.Validate(); err != nil { c.String(http.StatusBadRequest, err.Error()) diff --git a/server/cache/membership.go b/server/cache/membership.go index 45b6af5d1..38926540f 100644 --- a/server/cache/membership.go +++ b/server/cache/membership.go @@ -23,39 +23,39 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/server/forge" "go.woodpecker-ci.org/woodpecker/v2/server/model" + "go.woodpecker-ci.org/woodpecker/v2/server/store" ) // MembershipService is a service to check for user membership. type MembershipService interface { // Get returns if the user is a member of the organization. - Get(ctx context.Context, u *model.User, org string) (*model.OrgPerm, error) + Get(ctx context.Context, _forge forge.Forge, u *model.User, org string) (*model.OrgPerm, error) } type membershipCache struct { - forge forge.Forge cache *ttlcache.Cache[string, *model.OrgPerm] + store store.Store ttl time.Duration } // NewMembershipService creates a new membership service. -func NewMembershipService(f forge.Forge) MembershipService { - //nolint:gomnd +func NewMembershipService(_store store.Store) MembershipService { return &membershipCache{ - ttl: 10 * time.Minute, - forge: f, + ttl: 10 * time.Minute, //nolint: gomnd + store: _store, cache: ttlcache.New(ttlcache.WithDisableTouchOnHit[string, *model.OrgPerm]()), } } // Get returns if the user is a member of the organization. -func (c *membershipCache) Get(ctx context.Context, u *model.User, org string) (*model.OrgPerm, error) { +func (c *membershipCache) Get(ctx context.Context, _forge forge.Forge, u *model.User, org string) (*model.OrgPerm, error) { key := fmt.Sprintf("%s-%s", u.ForgeRemoteID, org) item := c.cache.Get(key) if item != nil && !item.IsExpired() { return item.Value(), nil } - perm, err := c.forge.OrgMembership(ctx, u, org) + perm, err := _forge.OrgMembership(ctx, u, org) if err != nil { return nil, err } diff --git a/server/config.go b/server/config.go index 84b56c29a..e8ac177ee 100644 --- a/server/config.go +++ b/server/config.go @@ -21,7 +21,6 @@ import ( "time" "go.woodpecker-ci.org/woodpecker/v2/server/cache" - "go.woodpecker-ci.org/woodpecker/v2/server/forge" "go.woodpecker-ci.org/woodpecker/v2/server/logging" "go.woodpecker-ci.org/woodpecker/v2/server/model" "go.woodpecker-ci.org/woodpecker/v2/server/pubsub" @@ -35,9 +34,8 @@ var Config = struct { Pubsub *pubsub.Publisher Queue queue.Queue Logs logging.Log - Forge forge.Forge Membership cache.MembershipService - Manager *services.Manager + Manager services.Manager } Server struct { Key string diff --git a/server/cron/cron.go b/server/cron/cron.go index a5dfc27fa..b3331f46c 100644 --- a/server/cron/cron.go +++ b/server/cron/cron.go @@ -22,6 +22,7 @@ import ( "github.com/robfig/cron" "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/pipeline" @@ -37,7 +38,7 @@ const ( ) // Start starts the cron scheduler loop -func Start(ctx context.Context, store store.Store, forge forge.Forge) error { +func Start(ctx context.Context, store store.Store) error { for { select { case <-ctx.Done(): @@ -54,7 +55,7 @@ func Start(ctx context.Context, store store.Store, forge forge.Forge) error { } for _, cron := range crons { - if err := runCron(ctx, store, forge, cron, now); err != nil { + if err := runCron(ctx, store, cron, now); err != nil { log.Error().Err(err).Int64("cronID", cron.ID).Msg("run cron failed") } } @@ -77,7 +78,7 @@ func CalcNewNext(schedule string, now time.Time) (time.Time, error) { return c.Next(now), nil } -func runCron(ctx context.Context, store store.Store, forge forge.Forge, cron *model.Cron, now time.Time) error { +func runCron(ctx context.Context, store store.Store, cron *model.Cron, now time.Time) error { log.Trace().Msgf("cron: run id[%d]", cron.ID) newNext, err := CalcNewNext(cron.Schedule, now) @@ -95,7 +96,7 @@ func runCron(ctx context.Context, store store.Store, forge forge.Forge, cron *mo return nil } - repo, newPipeline, err := CreatePipeline(ctx, store, forge, cron) + repo, newPipeline, err := CreatePipeline(ctx, store, cron) if err != nil { return err } @@ -104,12 +105,17 @@ func runCron(ctx context.Context, store store.Store, forge forge.Forge, cron *mo return err } -func CreatePipeline(ctx context.Context, store store.Store, f forge.Forge, cron *model.Cron) (*model.Repo, *model.Pipeline, error) { +func CreatePipeline(ctx context.Context, store store.Store, cron *model.Cron) (*model.Repo, *model.Pipeline, error) { repo, err := store.GetRepo(cron.RepoID) if err != nil { return nil, nil, err } + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + return nil, nil, err + } + if cron.Branch == "" { // fallback to the repos default branch cron.Branch = repo.Branch @@ -123,9 +129,9 @@ func CreatePipeline(ctx context.Context, store store.Store, f forge.Forge, cron // If the forge has a refresh token, the current access token // may be stale. Therefore, we should refresh prior to dispatching // the pipeline. - forge.Refresh(ctx, f, store, creator) + forge.Refresh(ctx, _forge, store, creator) - commit, err := f.BranchHead(ctx, creator, repo, cron.Branch) + commit, err := _forge.BranchHead(ctx, creator, repo, cron.Branch) if err != nil { return nil, nil, err } diff --git a/server/cron/cron_test.go b/server/cron/cron_test.go index 0b170cfe9..61f1a2538 100644 --- a/server/cron/cron_test.go +++ b/server/cron/cron_test.go @@ -22,13 +22,16 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "go.woodpecker-ci.org/woodpecker/v2/server" mocks_forge "go.woodpecker-ci.org/woodpecker/v2/server/forge/mocks" "go.woodpecker-ci.org/woodpecker/v2/server/model" + mocks_manager "go.woodpecker-ci.org/woodpecker/v2/server/services/mocks" mocks_store "go.woodpecker-ci.org/woodpecker/v2/server/store/mocks" ) -func TestCreateBuild(t *testing.T) { - forge := mocks_forge.NewForge(t) +func TestCreatePipeline(t *testing.T) { + _manager := mocks_manager.NewManager(t) + _forge := mocks_forge.NewForge(t) store := mocks_store.NewStore(t) ctx := context.Background() @@ -47,12 +50,14 @@ func TestCreateBuild(t *testing.T) { // mock things store.On("GetRepo", mock.Anything).Return(repo1, nil) store.On("GetUser", mock.Anything).Return(creator, nil) - forge.On("BranchHead", mock.Anything, creator, repo1, "default").Return(&model.Commit{ + _forge.On("BranchHead", mock.Anything, creator, repo1, "default").Return(&model.Commit{ ForgeURL: "https://example.com/sha1", SHA: "sha1", }, nil) + _manager.On("ForgeFromRepo", repo1).Return(_forge, nil) + server.Config.Services.Manager = _manager - _, pipeline, err := CreatePipeline(ctx, store, forge, &model.Cron{ + _, pipeline, err := CreatePipeline(ctx, store, &model.Cron{ Name: "test", }) assert.NoError(t, err) diff --git a/server/forge/forge.go b/server/forge/forge.go index a823bc422..bb5db187d 100644 --- a/server/forge/forge.go +++ b/server/forge/forge.go @@ -15,7 +15,6 @@ package forge -//go:generate go install github.com/vektra/mockery/v2@latest //go:generate mockery --name Forge --output mocks --case underscore import ( diff --git a/server/forge/mocks/forge.go b/server/forge/mocks/forge.go index e47fd1490..a926ca16a 100644 --- a/server/forge/mocks/forge.go +++ b/server/forge/mocks/forge.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.42.1. DO NOT EDIT. +// Code generated by mockery. DO NOT EDIT. package mocks diff --git a/server/forge/setup/setup.go b/server/forge/setup/setup.go new file mode 100644 index 000000000..d5ce8f742 --- /dev/null +++ b/server/forge/setup/setup.go @@ -0,0 +1,134 @@ +package setup + +import ( + "fmt" + "net/url" + "strings" + + "github.com/rs/zerolog/log" + + "go.woodpecker-ci.org/woodpecker/v2/server/forge" + "go.woodpecker-ci.org/woodpecker/v2/server/forge/addon" + "go.woodpecker-ci.org/woodpecker/v2/server/forge/bitbucket" + "go.woodpecker-ci.org/woodpecker/v2/server/forge/bitbucketdatacenter" + "go.woodpecker-ci.org/woodpecker/v2/server/forge/gitea" + "go.woodpecker-ci.org/woodpecker/v2/server/forge/github" + "go.woodpecker-ci.org/woodpecker/v2/server/forge/gitlab" + "go.woodpecker-ci.org/woodpecker/v2/server/model" +) + +func Forge(forge *model.Forge) (forge.Forge, error) { + switch forge.Type { + case model.ForgeTypeAddon: + return setupAddon(forge) + case model.ForgeTypeGithub: + return setupGitHub(forge) + case model.ForgeTypeGitlab: + return setupGitLab(forge) + case model.ForgeTypeBitbucket: + return setupBitbucket(forge) + case model.ForgeTypeGitea: + return setupGitea(forge) + case model.ForgeTypeBitbucketDatacenter: + return setupBitbucketDatacenter(forge) + default: + return nil, fmt.Errorf("forge not configured") + } +} + +func setupBitbucket(forge *model.Forge) (forge.Forge, error) { + opts := &bitbucket.Opts{ + Client: forge.Client, + Secret: forge.ClientSecret, + } + log.Trace().Msgf("Forge (bitbucket) opts: %#v", opts) + return bitbucket.New(opts) +} + +func setupGitea(forge *model.Forge) (forge.Forge, error) { + server, err := url.Parse(forge.URL) + if err != nil { + return nil, err + } + + oauthURL, ok := forge.AdditionalOptions["oauth-server"].(string) + if !ok { + return nil, fmt.Errorf("missing oauth-server") + } + + opts := gitea.Opts{ + URL: strings.TrimRight(server.String(), "/"), + Client: forge.Client, + Secret: forge.ClientSecret, + SkipVerify: forge.SkipVerify, + OAuth2URL: oauthURL, + } + if len(opts.URL) == 0 { + return nil, fmt.Errorf("WOODPECKER_GITEA_URL must be set") + } + log.Trace().Msgf("Forge (gitea) opts: %#v", opts) + return gitea.New(opts) +} + +func setupGitLab(forge *model.Forge) (forge.Forge, error) { + return gitlab.New(gitlab.Opts{ + URL: forge.URL, + ClientID: forge.Client, + ClientSecret: forge.ClientSecret, + SkipVerify: forge.SkipVerify, + }) +} + +func setupGitHub(forge *model.Forge) (forge.Forge, error) { + mergeRef, ok := forge.AdditionalOptions["merge-ref"].(bool) + if !ok { + return nil, fmt.Errorf("missing merge-ref") + } + + publicOnly, ok := forge.AdditionalOptions["public-only"].(bool) + if !ok { + return nil, fmt.Errorf("missing public-only") + } + + opts := github.Opts{ + URL: forge.URL, + Client: forge.Client, + Secret: forge.ClientSecret, + SkipVerify: forge.SkipVerify, + MergeRef: mergeRef, + OnlyPublic: publicOnly, + } + log.Trace().Msgf("Forge (github) opts: %#v", opts) + return github.New(opts) +} + +func setupBitbucketDatacenter(forge *model.Forge) (forge.Forge, error) { + gitUsername, ok := forge.AdditionalOptions["git-username"].(string) + if !ok { + return nil, fmt.Errorf("missing git-username") + } + gitPassword, ok := forge.AdditionalOptions["git-password"].(string) + if !ok { + return nil, fmt.Errorf("missing git-password") + } + + opts := bitbucketdatacenter.Opts{ + URL: forge.URL, + ClientID: forge.Client, + ClientSecret: forge.ClientSecret, + Username: gitUsername, + Password: gitPassword, + } + log.Trace().Msgf("Forge (bitbucketdatacenter) opts: %#v", opts) + return bitbucketdatacenter.New(opts) +} + +func setupAddon(forge *model.Forge) (forge.Forge, error) { + executable, ok := forge.AdditionalOptions["executable"].(string) + if !ok { + return nil, fmt.Errorf("missing git-username") + } + + log.Trace().Msgf("Forge (addon) executable: %#v", executable) + return addon.Load(executable) +} diff --git a/server/grpc/rpc.go b/server/grpc/rpc.go index c4293c6ab..59e27885d 100644 --- a/server/grpc/rpc.go +++ b/server/grpc/rpc.go @@ -31,6 +31,7 @@ import ( grpcMetadata "google.golang.org/grpc/metadata" "go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc" + "go.woodpecker-ci.org/woodpecker/v2/server" "go.woodpecker-ci.org/woodpecker/v2/server/forge" "go.woodpecker-ci.org/woodpecker/v2/server/logging" "go.woodpecker-ci.org/woodpecker/v2/server/model" @@ -41,7 +42,6 @@ import ( ) type RPC struct { - forge forge.Forge queue queue.Queue pubsub *pubsub.Publisher logger logging.Log @@ -418,11 +418,17 @@ func (s *RPC) updateForgeStatus(ctx context.Context, repo *model.Repo, pipeline return } - forge.Refresh(ctx, s.forge, s.store, user) + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msgf("can not get forge for repo '%s'", repo.FullName) + return + } + + forge.Refresh(ctx, _forge, s.store, user) // only do status updates for parent steps if workflow != nil { - err = s.forge.Status(ctx, user, repo, pipeline, workflow) + err = _forge.Status(ctx, user, repo, pipeline, workflow) if err != nil { log.Error().Err(err).Msgf("error setting commit status for %s/%d", repo.FullName, pipeline.Number) } diff --git a/server/grpc/server.go b/server/grpc/server.go index 83a983351..81b4dc8b1 100644 --- a/server/grpc/server.go +++ b/server/grpc/server.go @@ -23,7 +23,6 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc" "go.woodpecker-ci.org/woodpecker/v2/pipeline/rpc/proto" - "go.woodpecker-ci.org/woodpecker/v2/server/forge" "go.woodpecker-ci.org/woodpecker/v2/server/logging" "go.woodpecker-ci.org/woodpecker/v2/server/pubsub" "go.woodpecker-ci.org/woodpecker/v2/server/queue" @@ -37,7 +36,7 @@ type WoodpeckerServer struct { peer RPC } -func NewWoodpeckerServer(forge forge.Forge, queue queue.Queue, logger logging.Log, pubsub *pubsub.Publisher, store store.Store) proto.WoodpeckerServer { +func NewWoodpeckerServer(queue queue.Queue, logger logging.Log, pubsub *pubsub.Publisher, store store.Store) proto.WoodpeckerServer { pipelineTime := promauto.NewGaugeVec(prometheus.GaugeOpts{ Namespace: "woodpecker", Name: "pipeline_time", @@ -49,7 +48,6 @@ func NewWoodpeckerServer(forge forge.Forge, queue queue.Queue, logger logging.Lo Help: "Pipeline count.", }, []string{"repo", "branch", "status", "pipeline"}) peer := RPC{ - forge: forge, store: store, queue: queue, pubsub: pubsub, diff --git a/server/model/forge.go b/server/model/forge.go new file mode 100644 index 000000000..8190fc34d --- /dev/null +++ b/server/model/forge.go @@ -0,0 +1,36 @@ +// 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 + +type ForgeType string + +const ( + ForgeTypeGithub ForgeType = "github" + ForgeTypeGitlab ForgeType = "gitlab" + ForgeTypeGitea ForgeType = "gitea" + ForgeTypeBitbucket ForgeType = "bitbucket" + ForgeTypeBitbucketDatacenter ForgeType = "bitbucket-dc" + ForgeTypeAddon ForgeType = "addon" +) + +type Forge struct { + ID int64 `xorm:"pk autoincr 'id'"` + Type ForgeType `xorm:"VARCHAR(250)"` + URL string `xorm:"VARCHAR(500) 'url'"` + Client string `xorm:"VARCHAR(250)"` + ClientSecret string `xorm:"VARCHAR(250)"` + SkipVerify bool `xorm:"bool"` + AdditionalOptions map[string]any `xorm:"json"` +} diff --git a/server/model/org.go b/server/model/org.go index db093bb64..0cf2ae3d0 100644 --- a/server/model/org.go +++ b/server/model/org.go @@ -16,11 +16,12 @@ package model // Org represents an organization. type Org struct { - ID int64 `json:"id,omitempty" xorm:"pk autoincr 'id'"` - Name string `json:"name" xorm:"UNIQUE 'name'"` - IsUser bool `json:"is_user" xorm:"is_user"` + ID int64 `json:"id,omitempty" xorm:"pk autoincr 'id'"` + ForgeID int64 `json:"forge_id,omitempty" xorm:"forge_id"` + Name string `json:"name" xorm:"UNIQUE 'name'"` + IsUser bool `json:"is_user" xorm:"is_user"` // if name lookup has to check for membership or not - Private bool `json:"-" xorm:"private"` + Private bool `json:"-" xorm:"private"` } // @name Org // TableName return database table name for xorm diff --git a/server/model/repo.go b/server/model/repo.go index 877185c3a..a2f7fca4f 100644 --- a/server/model/repo.go +++ b/server/model/repo.go @@ -22,8 +22,9 @@ import ( // Repo represents a repository. type Repo struct { - ID int64 `json:"id,omitempty" xorm:"pk autoincr 'repo_id'"` - UserID int64 `json:"-" xorm:"repo_user_id"` + ID int64 `json:"id,omitempty" xorm:"pk autoincr 'repo_id'"` + UserID int64 `json:"-" xorm:"repo_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:"repo_org_id"` diff --git a/server/model/user.go b/server/model/user.go index 152df68ac..578d6caf2 100644 --- a/server/model/user.go +++ b/server/model/user.go @@ -34,6 +34,8 @@ type User struct { // required: true ID int64 `json:"id" xorm:"pk autoincr 'user_id'"` + ForgeID int64 `json:"forge_id,omitempty" xorm:"forge_id"` + ForgeRemoteID ForgeRemoteID `json:"-" xorm:"forge_remote_id"` // Login is the username for this user. diff --git a/server/pipeline/approve.go b/server/pipeline/approve.go index 31db7fdff..22d8a8fa4 100644 --- a/server/pipeline/approve.go +++ b/server/pipeline/approve.go @@ -20,6 +20,7 @@ import ( "github.com/rs/zerolog/log" + "go.woodpecker-ci.org/woodpecker/v2/server" forge_types "go.woodpecker-ci.org/woodpecker/v2/server/forge/types" "go.woodpecker-ci.org/woodpecker/v2/server/model" "go.woodpecker-ci.org/woodpecker/v2/server/store" @@ -32,6 +33,13 @@ func Approve(ctx context.Context, store store.Store, currentPipeline *model.Pipe return nil, ErrBadRequest{Msg: fmt.Sprintf("cannot approve a pipeline with status %s", currentPipeline.Status)} } + forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + 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) + } + // fetch the pipeline file from the database configs, err := store.ConfigsForPipeline(currentPipeline.ID) if err != nil { @@ -72,7 +80,7 @@ func Approve(ctx context.Context, store store.Store, currentPipeline *model.Pipe } } - currentPipeline, pipelineItems, err := createPipelineItems(ctx, store, currentPipeline, user, repo, yamls, nil) + currentPipeline, pipelineItems, err := createPipelineItems(ctx, forge, store, currentPipeline, user, repo, yamls, nil) if err != nil { msg := fmt.Sprintf("failure to createPipelineItems for %s", repo.FullName) log.Error().Err(err).Msg(msg) @@ -86,9 +94,9 @@ func Approve(ctx context.Context, store store.Store, currentPipeline *model.Pipe return nil, err } - publishPipeline(ctx, currentPipeline, repo, user) + publishPipeline(ctx, forge, currentPipeline, repo, user) - currentPipeline, err = start(ctx, store, currentPipeline, user, repo, pipelineItems) + currentPipeline, err = start(ctx, forge, store, currentPipeline, user, repo, pipelineItems) if err != nil { msg := fmt.Sprintf("failure to start pipeline for %s: %v", repo.FullName, err) log.Error().Err(err).Msg(msg) diff --git a/server/pipeline/cancel.go b/server/pipeline/cancel.go index 46407436e..253e1d586 100644 --- a/server/pipeline/cancel.go +++ b/server/pipeline/cancel.go @@ -21,13 +21,14 @@ 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/queue" "go.woodpecker-ci.org/woodpecker/v2/server/store" ) // Cancel the pipeline and returns the status. -func Cancel(ctx context.Context, store store.Store, repo *model.Repo, user *model.User, pipeline *model.Pipeline) error { +func Cancel(ctx context.Context, _forge forge.Forge, store store.Store, repo *model.Repo, user *model.User, pipeline *model.Pipeline) error { if pipeline.Status != model.StatusRunning && pipeline.Status != model.StatusPending && pipeline.Status != model.StatusBlocked { return &ErrBadRequest{Msg: "Cannot cancel a non-running or non-pending or non-blocked pipeline"} } @@ -88,7 +89,7 @@ func Cancel(ctx context.Context, store store.Store, repo *model.Repo, user *mode return err } - updatePipelineStatus(ctx, killedPipeline, repo, user) + updatePipelineStatus(ctx, _forge, killedPipeline, repo, user) if killedPipeline.Workflows, err = store.WorkflowGetTree(killedPipeline); err != nil { return err @@ -100,6 +101,7 @@ func Cancel(ctx context.Context, store store.Store, repo *model.Repo, user *mode func cancelPreviousPipelines( ctx context.Context, + _forge forge.Forge, _store store.Store, pipeline *model.Pipeline, repo *model.Repo, @@ -150,7 +152,7 @@ func cancelPreviousPipelines( continue } - if err = Cancel(ctx, _store, repo, user, active); err != nil { + if err = Cancel(ctx, _forge, _store, repo, user, active); err != nil { log.Error(). Err(err). Str("ref", active.Ref). diff --git a/server/pipeline/create.go b/server/pipeline/create.go index cf8938b64..d2435959c 100644 --- a/server/pipeline/create.go +++ b/server/pipeline/create.go @@ -34,7 +34,6 @@ var skipPipelineRegex = regexp.MustCompile(`\[(?i:ci *skip|skip *ci)\]`) // Create a new pipeline and start it func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline *model.Pipeline) (*model.Pipeline, error) { - _forge := server.Config.Services.Forge repoUser, err := _store.GetUser(repo.UserID) if err != nil { msg := fmt.Sprintf("failure to find repo owner via id '%d'", repo.UserID) @@ -54,6 +53,13 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline } } + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + 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) + } + // If the forge has a refresh token, the current access token // may be stale. Therefore, we should refresh prior to dispatching // the pipeline. @@ -82,13 +88,13 @@ 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, _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("pipeline definition not found in %s", repo.FullName)) } - pipelineItems, parseErr := parsePipeline(_store, pipeline, repoUser, repo, forgeYamlConfigs, nil) + pipelineItems, parseErr := parsePipeline(_forge, _store, pipeline, repoUser, repo, forgeYamlConfigs, nil) if pipeline_errors.HasBlockingErrors(parseErr) { log.Debug().Str("repo", repo.FullName).Err(parseErr).Msg("failed to parse yaml") - return nil, updatePipelineWithErr(ctx, _store, pipeline, repo, repoUser, parseErr) + return nil, updatePipelineWithErr(ctx, _forge, _store, pipeline, repo, repoUser, parseErr) } else if parseErr != nil { pipeline.Errors = pipeline_errors.GetPipelineErrors(parseErr) } @@ -122,7 +128,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline return nil, fmt.Errorf(msg) } - if err := prepareStart(ctx, _store, pipeline, repoUser, repo); err != nil { + if err := prepareStart(ctx, _forge, _store, pipeline, repoUser, repo); err != nil { log.Error().Err(err).Str("repo", repo.FullName).Msgf("error preparing pipeline for %s#%d", repo.FullName, pipeline.Number) return nil, err } @@ -131,11 +137,11 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline return pipeline, nil } - if err := updatePipelinePending(ctx, _store, pipeline, repo, repoUser); err != nil { + if err := updatePipelinePending(ctx, _forge, _store, pipeline, repo, repoUser); err != nil { return nil, err } - pipeline, err = start(ctx, _store, pipeline, repoUser, repo, pipelineItems) + pipeline, err = start(ctx, _forge, _store, pipeline, repoUser, repo, pipelineItems) if err != nil { msg := fmt.Sprintf("failed to start pipeline for %s", repo.FullName) log.Error().Err(err).Msg(msg) @@ -145,7 +151,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline return pipeline, nil } -func updatePipelineWithErr(ctx context.Context, _store store.Store, pipeline *model.Pipeline, repo *model.Repo, repoUser *model.User, err error) error { +func updatePipelineWithErr(ctx context.Context, _forge forge.Forge, _store store.Store, pipeline *model.Pipeline, repo *model.Repo, repoUser *model.User, err error) error { _pipeline, err := UpdateToStatusError(_store, *pipeline, err) if err != nil { return err @@ -153,12 +159,12 @@ func updatePipelineWithErr(ctx context.Context, _store store.Store, pipeline *mo // update value in ref *pipeline = *_pipeline - publishPipeline(ctx, pipeline, repo, repoUser) + publishPipeline(ctx, _forge, pipeline, repo, repoUser) return nil } -func updatePipelinePending(ctx context.Context, _store store.Store, pipeline *model.Pipeline, repo *model.Repo, repoUser *model.User) error { +func updatePipelinePending(ctx context.Context, _forge forge.Forge, _store store.Store, pipeline *model.Pipeline, repo *model.Repo, repoUser *model.User) error { _pipeline, err := UpdateToStatusPending(_store, *pipeline, "") if err != nil { return err @@ -166,7 +172,7 @@ func updatePipelinePending(ctx context.Context, _store store.Store, pipeline *mo // update value in ref *pipeline = *_pipeline - publishPipeline(ctx, pipeline, repo, repoUser) + publishPipeline(ctx, _forge, pipeline, repo, repoUser) return nil } diff --git a/server/pipeline/decline.go b/server/pipeline/decline.go index 9587bf4ba..cf8dd0e9a 100644 --- a/server/pipeline/decline.go +++ b/server/pipeline/decline.go @@ -20,17 +20,25 @@ import ( "github.com/rs/zerolog/log" + "go.woodpecker-ci.org/woodpecker/v2/server" "go.woodpecker-ci.org/woodpecker/v2/server/model" "go.woodpecker-ci.org/woodpecker/v2/server/store" ) // Decline updates the status to declined for blocked pipelines because of a gated repo func Decline(ctx context.Context, store store.Store, pipeline *model.Pipeline, user *model.User, repo *model.Repo) (*model.Pipeline, error) { + forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + 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) + } + if pipeline.Status != model.StatusBlocked { return nil, fmt.Errorf("cannot decline a pipeline with status %s", pipeline.Status) } - pipeline, err := UpdateToStatusDeclined(store, *pipeline, user.Login) + pipeline, err = UpdateToStatusDeclined(store, *pipeline, user.Login) if err != nil { return nil, fmt.Errorf("error updating pipeline. %w", err) } @@ -53,7 +61,7 @@ func Decline(ctx context.Context, store store.Store, pipeline *model.Pipeline, u } } - updatePipelineStatus(ctx, pipeline, repo, user) + updatePipelineStatus(ctx, forge, pipeline, repo, user) publishToTopic(pipeline, repo) diff --git a/server/pipeline/helper.go b/server/pipeline/helper.go index 497da291d..e8e3400a5 100644 --- a/server/pipeline/helper.go +++ b/server/pipeline/helper.go @@ -19,13 +19,13 @@ 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" ) -func updatePipelineStatus(ctx context.Context, pipeline *model.Pipeline, repo *model.Repo, user *model.User) { +func updatePipelineStatus(ctx context.Context, forge forge.Forge, pipeline *model.Pipeline, repo *model.Repo, user *model.User) { for _, workflow := range pipeline.Workflows { - err := server.Config.Services.Forge.Status(ctx, user, repo, pipeline, workflow) + err := forge.Status(ctx, user, repo, pipeline, workflow) if err != nil { log.Error().Err(err).Msgf("error setting commit status for %s/%d", repo.FullName, pipeline.Number) return diff --git a/server/pipeline/items.go b/server/pipeline/items.go index b44a06d47..737f2fc43 100644 --- a/server/pipeline/items.go +++ b/server/pipeline/items.go @@ -24,14 +24,15 @@ import ( pipeline_errors "go.woodpecker-ci.org/woodpecker/v2/pipeline/errors" "go.woodpecker-ci.org/woodpecker/v2/pipeline/frontend/yaml/compiler" "go.woodpecker-ci.org/woodpecker/v2/server" + "go.woodpecker-ci.org/woodpecker/v2/server/forge" forge_types "go.woodpecker-ci.org/woodpecker/v2/server/forge/types" "go.woodpecker-ci.org/woodpecker/v2/server/model" "go.woodpecker-ci.org/woodpecker/v2/server/pipeline/stepbuilder" "go.woodpecker-ci.org/woodpecker/v2/server/store" ) -func parsePipeline(store store.Store, currentPipeline *model.Pipeline, user *model.User, repo *model.Repo, yamls []*forge_types.FileMeta, envs map[string]string) ([]*stepbuilder.Item, error) { - netrc, err := server.Config.Services.Forge.Netrc(user, repo) +func parsePipeline(forge forge.Forge, store store.Store, currentPipeline *model.Pipeline, user *model.User, repo *model.Repo, yamls []*forge_types.FileMeta, envs map[string]string) ([]*stepbuilder.Item, error) { + netrc, err := forge.Netrc(user, repo) if err != nil { log.Error().Err(err).Msg("failed to generate netrc file") } @@ -80,7 +81,7 @@ func parsePipeline(store store.Store, currentPipeline *model.Pipeline, user *mod Envs: envs, Host: server.Config.Server.Host, Yamls: yamls, - Forge: server.Config.Services.Forge, + Forge: forge, ProxyOpts: compiler.ProxyOptions{ NoProxy: server.Config.Pipeline.Proxy.No, HTTPProxy: server.Config.Pipeline.Proxy.HTTP, @@ -90,23 +91,23 @@ func parsePipeline(store store.Store, currentPipeline *model.Pipeline, user *mod return b.Build() } -func createPipelineItems(c context.Context, store store.Store, +func createPipelineItems(c context.Context, forge forge.Forge, store store.Store, currentPipeline *model.Pipeline, user *model.User, repo *model.Repo, yamls []*forge_types.FileMeta, envs map[string]string, ) (*model.Pipeline, []*stepbuilder.Item, error) { - pipelineItems, err := parsePipeline(store, currentPipeline, user, repo, yamls, envs) + pipelineItems, err := parsePipeline(forge, store, currentPipeline, user, repo, yamls, envs) if pipeline_errors.HasBlockingErrors(err) { currentPipeline, uerr := UpdateToStatusError(store, *currentPipeline, err) if uerr != nil { log.Error().Err(uerr).Msgf("error setting error status of pipeline for %s#%d", repo.FullName, currentPipeline.Number) } else { - updatePipelineStatus(c, currentPipeline, repo, user) + updatePipelineStatus(c, forge, currentPipeline, repo, user) } return currentPipeline, nil, err } else if err != nil { currentPipeline.Errors = pipeline_errors.GetPipelineErrors(err) - err = updatePipelinePending(c, store, currentPipeline, repo, user) + err = updatePipelinePending(c, forge, store, currentPipeline, repo, user) } currentPipeline = setPipelineStepsOnPipeline(currentPipeline, pipelineItems) diff --git a/server/pipeline/restart.go b/server/pipeline/restart.go index 11e3c68fc..fd0121974 100644 --- a/server/pipeline/restart.go +++ b/server/pipeline/restart.go @@ -29,7 +29,13 @@ import ( // Restart a pipeline by creating a new one out of the old and start it func Restart(ctx context.Context, store store.Store, lastPipeline *model.Pipeline, user *model.User, repo *model.Repo, envs map[string]string) (*model.Pipeline, error) { - forge := server.Config.Services.Forge + forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + 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) + } + switch lastPipeline.Status { case model.StatusDeclined, model.StatusBlocked: @@ -72,7 +78,7 @@ func Restart(ctx context.Context, store store.Store, lastPipeline *model.Pipelin if uerr != nil { log.Debug().Err(uerr).Msg("failure to update pipeline status") } else { - updatePipelineStatus(ctx, newPipeline, repo, user) + updatePipelineStatus(ctx, forge, newPipeline, repo, user) } return newPipeline, nil } @@ -82,20 +88,20 @@ func Restart(ctx context.Context, store store.Store, lastPipeline *model.Pipelin return nil, fmt.Errorf(msg) } - newPipeline, pipelineItems, err := createPipelineItems(ctx, store, newPipeline, user, repo, pipelineFiles, envs) + 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) } - if err := prepareStart(ctx, store, newPipeline, user, repo); err != nil { + 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) } - newPipeline, err = start(ctx, store, newPipeline, user, repo, pipelineItems) + 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) diff --git a/server/pipeline/start.go b/server/pipeline/start.go index afad25723..f136fea29 100644 --- a/server/pipeline/start.go +++ b/server/pipeline/start.go @@ -19,20 +19,21 @@ import ( "github.com/rs/zerolog/log" + "go.woodpecker-ci.org/woodpecker/v2/server/forge" "go.woodpecker-ci.org/woodpecker/v2/server/model" "go.woodpecker-ci.org/woodpecker/v2/server/pipeline/stepbuilder" "go.woodpecker-ci.org/woodpecker/v2/server/store" ) // start a pipeline, make sure it was stored persistent in the store before -func start(ctx context.Context, store store.Store, activePipeline *model.Pipeline, user *model.User, repo *model.Repo, pipelineItems []*stepbuilder.Item) (*model.Pipeline, error) { +func start(ctx context.Context, forge forge.Forge, store store.Store, activePipeline *model.Pipeline, user *model.User, repo *model.Repo, pipelineItems []*stepbuilder.Item) (*model.Pipeline, error) { // call to cancel previous pipelines if needed - if err := cancelPreviousPipelines(ctx, store, activePipeline, repo, user); err != nil { + if err := cancelPreviousPipelines(ctx, forge, store, activePipeline, repo, user); err != nil { // should be not breaking log.Error().Err(err).Msg("failed to cancel previous pipelines") } - publishPipeline(ctx, activePipeline, repo, user) + publishPipeline(ctx, forge, activePipeline, repo, user) if err := queuePipeline(ctx, repo, pipelineItems); err != nil { log.Error().Err(err).Msg("queuePipeline") @@ -42,17 +43,17 @@ func start(ctx context.Context, store store.Store, activePipeline *model.Pipelin return activePipeline, nil } -func prepareStart(ctx context.Context, store store.Store, activePipeline *model.Pipeline, user *model.User, repo *model.Repo) error { +func prepareStart(ctx context.Context, forge forge.Forge, store store.Store, activePipeline *model.Pipeline, user *model.User, repo *model.Repo) error { if err := store.WorkflowsCreate(activePipeline.Workflows); err != nil { log.Error().Err(err).Str("repo", repo.FullName).Msgf("error persisting steps for %s#%d", repo.FullName, activePipeline.Number) return err } - publishPipeline(ctx, activePipeline, repo, user) + publishPipeline(ctx, forge, activePipeline, repo, user) return nil } -func publishPipeline(ctx context.Context, pipeline *model.Pipeline, repo *model.Repo, repoUser *model.User) { +func publishPipeline(ctx context.Context, forge forge.Forge, pipeline *model.Pipeline, repo *model.Repo, repoUser *model.User) { publishToTopic(pipeline, repo) - updatePipelineStatus(ctx, pipeline, repo, repoUser) + updatePipelineStatus(ctx, forge, pipeline, repo, repoUser) } diff --git a/server/router/middleware/session/repo.go b/server/router/middleware/session/repo.go index b89f163f8..93cfb2c7c 100644 --- a/server/router/middleware/session/repo.go +++ b/server/router/middleware/session/repo.go @@ -106,6 +106,13 @@ func SetPerm() gin.HandlerFunc { _store := store.FromContext(c) user := User(c) repo := Repo(c) + _forge, err := server.Config.Services.Manager.ForgeFromRepo(repo) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from repo") + c.AbortWithStatus(http.StatusInternalServerError) + return + } + perm := new(model.Perm) if user != nil { @@ -116,7 +123,7 @@ func SetPerm() gin.HandlerFunc { user.Login, repo.FullName) } if time.Unix(perm.Synced, 0).Add(time.Hour).Before(time.Now()) { - _repo, err := server.Config.Services.Forge.Repo(c, user, repo.ForgeRemoteID, repo.Owner, repo.Name) + _repo, err := _forge.Repo(c, user, repo.ForgeRemoteID, repo.Owner, repo.Name) if err == nil { log.Debug().Msgf("synced user permission for %s %s", user.Login, repo.FullName) perm = _repo.Perm diff --git a/server/router/middleware/session/user.go b/server/router/middleware/session/user.go index b0c1b7176..d1b1507ef 100644 --- a/server/router/middleware/session/user.go +++ b/server/router/middleware/session/user.go @@ -145,7 +145,14 @@ func MustOrgMember(admin bool) gin.HandlerFunc { return } - perm, err := server.Config.Services.Membership.Get(c, user, org.Name) + _forge, err := server.Config.Services.Manager.ForgeFromUser(user) + if err != nil { + log.Error().Err(err).Msg("Cannot get forge from user") + c.AbortWithStatus(http.StatusInternalServerError) + return + } + + perm, err := server.Config.Services.Membership.Get(c, _forge, user, org.Name) if err != nil { log.Error().Err(err).Msg("failed to check membership") c.String(http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError)) diff --git a/server/router/middleware/token/token.go b/server/router/middleware/token/token.go index 58415954d..8d45adda6 100644 --- a/server/router/middleware/token/token.go +++ b/server/router/middleware/token/token.go @@ -15,6 +15,8 @@ package token import ( + "net/http" + "github.com/gin-gonic/gin" "go.woodpecker-ci.org/woodpecker/v2/server" @@ -26,7 +28,13 @@ import ( func Refresh(c *gin.Context) { user := session.User(c) if user != nil { - forge.Refresh(c, server.Config.Services.Forge, store.FromContext(c), user) + _forge, err := server.Config.Services.Manager.ForgeFromUser(user) + if err != nil { + _ = c.AbortWithError(http.StatusInternalServerError, err) + return + } + + forge.Refresh(c, _forge, store.FromContext(c), user) } c.Next() diff --git a/server/services/environment/extension.go b/server/services/environment/service.go similarity index 100% rename from server/services/environment/extension.go rename to server/services/environment/service.go diff --git a/server/services/manager.go b/server/services/manager.go index d5669df2b..ff281c40a 100644 --- a/server/services/manager.go +++ b/server/services/manager.go @@ -16,9 +16,12 @@ package services import ( "crypto" + "time" + "github.com/jellydator/ttlcache/v3" "github.com/urfave/cli/v2" + "go.woodpecker-ci.org/woodpecker/v2/server/forge" "go.woodpecker-ci.org/woodpecker/v2/server/model" "go.woodpecker-ci.org/woodpecker/v2/server/services/config" "go.woodpecker-ci.org/woodpecker/v2/server/services/environment" @@ -27,56 +30,119 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/server/store" ) -type Manager struct { +//go:generate mockery --name Manager --output mocks --case underscore + +const forgeCacheTTL = 10 * time.Minute + +type SetupForge func(forge *model.Forge) (forge.Forge, error) + +type Manager interface { + SignaturePublicKey() crypto.PublicKey + SecretServiceFromRepo(repo *model.Repo) secret.Service + SecretService() secret.Service + RegistryServiceFromRepo(repo *model.Repo) registry.Service + RegistryService() registry.Service + ConfigServiceFromRepo(repo *model.Repo) config.Service + EnvironmentService() environment.Service + ForgeFromRepo(repo *model.Repo) (forge.Forge, error) + ForgeFromUser(user *model.User) (forge.Forge, error) + ForgeMain() (forge.Forge, error) +} + +type manager struct { + signaturePrivateKey crypto.PrivateKey + signaturePublicKey crypto.PublicKey + store store.Store secret secret.Service registry registry.Service config config.Service environment environment.Service - signaturePrivateKey crypto.PrivateKey - signaturePublicKey crypto.PublicKey + forgeCache *ttlcache.Cache[int64, forge.Forge] + setupForge SetupForge } -func NewManager(c *cli.Context, store store.Store) (*Manager, error) { +func NewManager(c *cli.Context, store store.Store, setupForge SetupForge) (Manager, error) { signaturePrivateKey, signaturePublicKey, err := setupSignatureKeys(store) if err != nil { return nil, err } - return &Manager{ + err = setupForgeService(c, store) + if err != nil { + return nil, err + } + + return &manager{ signaturePrivateKey: signaturePrivateKey, signaturePublicKey: signaturePublicKey, + store: store, secret: setupSecretService(store), registry: setupRegistryService(store, c.String("docker-config")), config: setupConfigService(c, signaturePrivateKey), environment: environment.Parse(c.StringSlice("environment")), + forgeCache: ttlcache.New(ttlcache.WithDisableTouchOnHit[int64, forge.Forge]()), + setupForge: setupForge, }, nil } -func (e *Manager) SignaturePublicKey() crypto.PublicKey { - return e.signaturePublicKey +func (m *manager) SignaturePublicKey() crypto.PublicKey { + return m.signaturePublicKey } -func (e *Manager) SecretServiceFromRepo(_ *model.Repo) secret.Service { - return e.SecretService() +func (m *manager) SecretServiceFromRepo(_ *model.Repo) secret.Service { + return m.SecretService() } -func (e *Manager) SecretService() secret.Service { - return e.secret +func (m *manager) SecretService() secret.Service { + return m.secret } -func (e *Manager) RegistryServiceFromRepo(_ *model.Repo) registry.Service { - return e.RegistryService() +func (m *manager) RegistryServiceFromRepo(_ *model.Repo) registry.Service { + return m.RegistryService() } -func (e *Manager) RegistryService() registry.Service { - return e.registry +func (m *manager) RegistryService() registry.Service { + return m.registry } -func (e *Manager) ConfigServiceFromRepo(_ *model.Repo) config.Service { +func (m *manager) ConfigServiceFromRepo(_ *model.Repo) config.Service { // TODO: decied based on repo property which config service to use - return e.config + return m.config } -func (e *Manager) EnvironmentService() environment.Service { - return e.environment +func (m *manager) EnvironmentService() environment.Service { + return m.environment +} + +func (m *manager) ForgeFromRepo(repo *model.Repo) (forge.Forge, error) { + return m.getForgeByID(repo.ForgeID) +} + +func (m *manager) ForgeFromUser(user *model.User) (forge.Forge, error) { + return m.getForgeByID(user.ForgeID) +} + +func (m *manager) ForgeMain() (forge.Forge, error) { + return m.getForgeByID(1) // main forge is always 1 and is configured via environment variables +} + +func (m *manager) getForgeByID(id int64) (forge.Forge, error) { + item := m.forgeCache.Get(id) + if item != nil && !item.IsExpired() { + return item.Value(), nil + } + + forgeModel, err := m.store.ForgeGet(id) + if err != nil { + return nil, err + } + + forge, err := m.setupForge(forgeModel) + if err != nil { + return nil, err + } + + m.forgeCache.Set(id, forge, forgeCacheTTL) + + return forge, nil } diff --git a/server/services/mocks/manager.go b/server/services/mocks/manager.go new file mode 100644 index 000000000..3c67c2c44 --- /dev/null +++ b/server/services/mocks/manager.go @@ -0,0 +1,270 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + crypto "crypto" + + config "go.woodpecker-ci.org/woodpecker/v2/server/services/config" + + environment "go.woodpecker-ci.org/woodpecker/v2/server/services/environment" + + forge "go.woodpecker-ci.org/woodpecker/v2/server/forge" + + mock "github.com/stretchr/testify/mock" + + model "go.woodpecker-ci.org/woodpecker/v2/server/model" + + registry "go.woodpecker-ci.org/woodpecker/v2/server/services/registry" + + secret "go.woodpecker-ci.org/woodpecker/v2/server/services/secret" +) + +// Manager is an autogenerated mock type for the Manager type +type Manager struct { + mock.Mock +} + +// ConfigServiceFromRepo provides a mock function with given fields: repo +func (_m *Manager) ConfigServiceFromRepo(repo *model.Repo) config.Service { + ret := _m.Called(repo) + + if len(ret) == 0 { + panic("no return value specified for ConfigServiceFromRepo") + } + + var r0 config.Service + if rf, ok := ret.Get(0).(func(*model.Repo) config.Service); ok { + r0 = rf(repo) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(config.Service) + } + } + + return r0 +} + +// EnvironmentService provides a mock function with given fields: +func (_m *Manager) EnvironmentService() environment.Service { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for EnvironmentService") + } + + var r0 environment.Service + if rf, ok := ret.Get(0).(func() environment.Service); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(environment.Service) + } + } + + return r0 +} + +// ForgeFromRepo provides a mock function with given fields: repo +func (_m *Manager) ForgeFromRepo(repo *model.Repo) (forge.Forge, error) { + ret := _m.Called(repo) + + if len(ret) == 0 { + panic("no return value specified for ForgeFromRepo") + } + + var r0 forge.Forge + var r1 error + if rf, ok := ret.Get(0).(func(*model.Repo) (forge.Forge, error)); ok { + return rf(repo) + } + if rf, ok := ret.Get(0).(func(*model.Repo) forge.Forge); ok { + r0 = rf(repo) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(forge.Forge) + } + } + + if rf, ok := ret.Get(1).(func(*model.Repo) error); ok { + r1 = rf(repo) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ForgeFromUser provides a mock function with given fields: user +func (_m *Manager) ForgeFromUser(user *model.User) (forge.Forge, error) { + ret := _m.Called(user) + + if len(ret) == 0 { + panic("no return value specified for ForgeFromUser") + } + + var r0 forge.Forge + var r1 error + if rf, ok := ret.Get(0).(func(*model.User) (forge.Forge, error)); ok { + return rf(user) + } + if rf, ok := ret.Get(0).(func(*model.User) forge.Forge); ok { + r0 = rf(user) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(forge.Forge) + } + } + + if rf, ok := ret.Get(1).(func(*model.User) error); ok { + r1 = rf(user) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ForgeMain provides a mock function with given fields: +func (_m *Manager) ForgeMain() (forge.Forge, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for ForgeMain") + } + + var r0 forge.Forge + var r1 error + if rf, ok := ret.Get(0).(func() (forge.Forge, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() forge.Forge); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(forge.Forge) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RegistryService provides a mock function with given fields: +func (_m *Manager) RegistryService() registry.Service { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for RegistryService") + } + + var r0 registry.Service + if rf, ok := ret.Get(0).(func() registry.Service); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(registry.Service) + } + } + + return r0 +} + +// RegistryServiceFromRepo provides a mock function with given fields: repo +func (_m *Manager) RegistryServiceFromRepo(repo *model.Repo) registry.Service { + ret := _m.Called(repo) + + if len(ret) == 0 { + panic("no return value specified for RegistryServiceFromRepo") + } + + var r0 registry.Service + if rf, ok := ret.Get(0).(func(*model.Repo) registry.Service); ok { + r0 = rf(repo) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(registry.Service) + } + } + + return r0 +} + +// SecretService provides a mock function with given fields: +func (_m *Manager) SecretService() secret.Service { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for SecretService") + } + + var r0 secret.Service + if rf, ok := ret.Get(0).(func() secret.Service); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(secret.Service) + } + } + + return r0 +} + +// SecretServiceFromRepo provides a mock function with given fields: repo +func (_m *Manager) SecretServiceFromRepo(repo *model.Repo) secret.Service { + ret := _m.Called(repo) + + if len(ret) == 0 { + panic("no return value specified for SecretServiceFromRepo") + } + + var r0 secret.Service + if rf, ok := ret.Get(0).(func(*model.Repo) secret.Service); ok { + r0 = rf(repo) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(secret.Service) + } + } + + return r0 +} + +// SignaturePublicKey provides a mock function with given fields: +func (_m *Manager) SignaturePublicKey() crypto.PublicKey { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for SignaturePublicKey") + } + + var r0 crypto.PublicKey + if rf, ok := ret.Get(0).(func() crypto.PublicKey); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(crypto.PublicKey) + } + } + + return r0 +} + +// NewManager creates a new instance of Manager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewManager(t interface { + mock.TestingT + Cleanup(func()) +}) *Manager { + mock := &Manager{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/server/services/setup.go b/server/services/setup.go index 1b25f82a3..c92ed9e3a 100644 --- a/server/services/setup.go +++ b/server/services/setup.go @@ -25,6 +25,7 @@ import ( "github.com/rs/zerolog/log" "github.com/urfave/cli/v2" + "go.woodpecker-ci.org/woodpecker/v2/server/model" "go.woodpecker-ci.org/woodpecker/v2/server/services/config" "go.woodpecker-ci.org/woodpecker/v2/server/services/registry" "go.woodpecker-ci.org/woodpecker/v2/server/services/secret" @@ -93,3 +94,70 @@ func setupSignatureKeys(_store store.Store) (crypto.PrivateKey, crypto.PublicKey privateKey := ed25519.PrivateKey(privKeyStr) return privateKey, privateKey.Public(), nil } + +func setupForgeService(c *cli.Context, _store store.Store) error { + _forge, err := _store.ForgeGet(1) + if err != nil && !errors.Is(err, types.RecordNotExist) { + return err + } + forgeExists := err == nil + if _forge == nil { + _forge = &model.Forge{ + ID: 0, + } + } + if _forge.AdditionalOptions == nil { + _forge.AdditionalOptions = make(map[string]any) + } + + _forge.Client = c.String("forge-oauth-client") + _forge.ClientSecret = c.String("forge-oauth-secret") + _forge.URL = c.String("forge-url") + _forge.SkipVerify = c.Bool("forge-skip-verify") + + switch { + case c.String("addon-forge") != "": + _forge.Type = model.ForgeTypeAddon + _forge.AdditionalOptions["executable"] = c.String("addon-forge") + case c.Bool("github"): + _forge.Type = model.ForgeTypeGithub + _forge.AdditionalOptions["merge-ref"] = c.Bool("github-merge-ref") + _forge.AdditionalOptions["public-only"] = c.Bool("github-public-only") + if _forge.URL == "" { + _forge.URL = "https://github.com" + } + case c.Bool("gitlab"): + _forge.Type = model.ForgeTypeGitlab + if _forge.URL == "" { + _forge.URL = "https://gitlab.com" + } + case c.Bool("gitea"): + _forge.Type = model.ForgeTypeGitea + _forge.AdditionalOptions["oauth-server"] = c.String("gitea-oauth-server") + if _forge.URL == "" { + _forge.URL = "https://try.gitea.com" + } + case c.Bool("bitbucket"): + _forge.Type = model.ForgeTypeBitbucket + case c.Bool("bitbucket-dc"): + _forge.Type = model.ForgeTypeBitbucketDatacenter + _forge.AdditionalOptions["git-username"] = c.String("bitbucket-dc-git-username") + _forge.AdditionalOptions["git-password"] = c.String("bitbucket-dc-git-password") + default: + return errors.New("forge not configured") + } + + if forgeExists { + err := _store.ForgeUpdate(_forge) + if err != nil { + return err + } + } else { + err := _store.ForgeCreate(_forge) + if err != nil { + return err + } + } + + return nil +} diff --git a/server/store/datastore/forge.go b/server/store/datastore/forge.go new file mode 100644 index 000000000..5c1a29efc --- /dev/null +++ b/server/store/datastore/forge.go @@ -0,0 +1,54 @@ +// 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 datastore + +import ( + "go.woodpecker-ci.org/woodpecker/v2/server/model" +) + +func (s storage) ForgeGet(id int64) (*model.Forge, error) { + forge := new(model.Forge) + return forge, wrapGet(s.engine.ID(id).Get(forge)) +} + +func (s storage) ForgeList(p *model.ListOptions) ([]*model.Forge, error) { + forges := make([]*model.Forge, 0, 10) + return forges, s.paginate(p).Find(&forges) +} + +func (s storage) ForgeCreate(forge *model.Forge) error { + // only Insert set auto created ID back to object + _, err := s.engine.Insert(forge) + return err +} + +func (s storage) ForgeUpdate(forge *model.Forge) error { + _, err := s.engine.ID(forge.ID).AllCols().Update(forge) + return err +} + +func (s storage) ForgeDelete(forge *model.Forge) error { + sess := s.engine.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + + if _, err := sess.ID(forge.ID).Delete(new(model.Forge)); err != nil { + return err + } + + return sess.Commit() +} diff --git a/server/store/datastore/forge_test.go b/server/store/datastore/forge_test.go new file mode 100644 index 000000000..a7583d8db --- /dev/null +++ b/server/store/datastore/forge_test.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 datastore + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "go.woodpecker-ci.org/woodpecker/v2/server/model" +) + +func TestForgeCRUD(t *testing.T) { + store, closer := newTestStore(t, new(model.Forge), new(model.Repo), new(model.User)) + defer closer() + + forge1 := &model.Forge{ + Type: "github", + URL: "https://github.com", + Client: "client", + ClientSecret: "secret", + SkipVerify: false, + AdditionalOptions: map[string]any{ + "foo": "bar", + }, + } + + // create first forge to play with + assert.NoError(t, store.ForgeCreate(forge1)) + assert.EqualValues(t, "github", forge1.Type) + + // retrieve it + forgeOne, err := store.ForgeGet(forge1.ID) + assert.NoError(t, err) + assert.EqualValues(t, forge1, forgeOne) + + // change type + assert.NoError(t, store.ForgeUpdate(&model.Forge{ID: forge1.ID, Type: "gitlab"})) + + // find updated forge by id + forgeOne, err = store.ForgeGet(forge1.ID) + assert.NoError(t, err) + assert.EqualValues(t, "gitlab", forgeOne.Type) + + // create two more forges and repos + someUser := &model.Forge{Type: "bitbucket"} + assert.NoError(t, store.ForgeCreate(someUser)) + assert.NoError(t, store.ForgeCreate(&model.Forge{Type: "gitea"})) + + // get all repos for a specific forge + forges, err := store.ForgeList(&model.ListOptions{All: true}) + assert.NoError(t, err) + assert.Len(t, forges, 3) + + // delete an forge and check if it's gone + assert.NoError(t, store.ForgeDelete(forge1)) + _, err = store.ForgeGet(forge1.ID) + assert.Error(t, err) +} diff --git a/server/store/datastore/migration/030_set_default_forge_id.go b/server/store/datastore/migration/030_set_default_forge_id.go new file mode 100644 index 000000000..994ebee16 --- /dev/null +++ b/server/store/datastore/migration/030_set_default_forge_id.go @@ -0,0 +1,46 @@ +// 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" +) + +var setForgeID = xormigrate.Migration{ + ID: "set-forge-id", + MigrateSession: func(sess *xorm.Session) (err error) { + if err := sess.Sync(new(model.User), new(model.Repo), new(model.Forge), 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;", model.User{}.TableName())) + if err != nil { + return err + } + + _, err = sess.Exec(fmt.Sprintf("UPDATE `%s` SET forge_id=1;", model.Org{}.TableName())) + if err != nil { + return err + } + + _, err = sess.Exec(fmt.Sprintf("UPDATE `%s` SET forge_id=1;", model.Repo{}.TableName())) + return err + }, +} diff --git a/server/store/datastore/migration/migration.go b/server/store/datastore/migration/migration.go index 6799c3e8e..f2af625a9 100644 --- a/server/store/datastore/migration/migration.go +++ b/server/store/datastore/migration/migration.go @@ -59,6 +59,7 @@ var migrationTasks = []*xormigrate.Migration{ &convertToNewPipelineErrorFormat, &renameLinkToURL, &cleanRegistryPipeline, + &setForgeID, } var allBeans = []any{ @@ -77,6 +78,7 @@ var allBeans = []any{ new(model.ServerConfig), new(model.Cron), new(model.Redirection), + new(model.Forge), new(model.Workflow), new(model.Org), } diff --git a/server/store/mocks/store.go b/server/store/mocks/store.go index 81522b9e9..3007b3ef4 100644 --- a/server/store/mocks/store.go +++ b/server/store/mocks/store.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.42.1. DO NOT EDIT. +// Code generated by mockery. DO NOT EDIT. package mocks @@ -539,6 +539,152 @@ func (_m *Store) DeleteUser(_a0 *model.User) error { return r0 } +// ForgeCreate provides a mock function with given fields: _a0 +func (_m *Store) ForgeCreate(_a0 *model.Forge) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(*model.Forge) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ForgeDelete provides a mock function with given fields: _a0 +func (_m *Store) ForgeDelete(_a0 *model.Forge) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(*model.Forge) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ForgeFindByRepo provides a mock function with given fields: _a0 +func (_m *Store) ForgeFindByRepo(_a0 *model.Repo) (*model.Forge, error) { + ret := _m.Called(_a0) + + var r0 *model.Forge + var r1 error + if rf, ok := ret.Get(0).(func(*model.Repo) (*model.Forge, error)); ok { + return rf(_a0) + } + if rf, ok := ret.Get(0).(func(*model.Repo) *model.Forge); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.Forge) + } + } + + if rf, ok := ret.Get(1).(func(*model.Repo) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ForgeFindByUser provides a mock function with given fields: _a0 +func (_m *Store) ForgeFindByUser(_a0 *model.User) (*model.Forge, error) { + ret := _m.Called(_a0) + + var r0 *model.Forge + var r1 error + if rf, ok := ret.Get(0).(func(*model.User) (*model.Forge, error)); ok { + return rf(_a0) + } + if rf, ok := ret.Get(0).(func(*model.User) *model.Forge); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.Forge) + } + } + + if rf, ok := ret.Get(1).(func(*model.User) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ForgeGet provides a mock function with given fields: _a0 +func (_m *Store) ForgeGet(_a0 int64) (*model.Forge, error) { + ret := _m.Called(_a0) + + var r0 *model.Forge + var r1 error + if rf, ok := ret.Get(0).(func(int64) (*model.Forge, error)); ok { + return rf(_a0) + } + if rf, ok := ret.Get(0).(func(int64) *model.Forge); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.Forge) + } + } + + if rf, ok := ret.Get(1).(func(int64) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ForgeList provides a mock function with given fields: p +func (_m *Store) ForgeList(p *model.ListOptions) ([]*model.Forge, error) { + ret := _m.Called(p) + + var r0 []*model.Forge + var r1 error + if rf, ok := ret.Get(0).(func(*model.ListOptions) ([]*model.Forge, error)); ok { + return rf(p) + } + if rf, ok := ret.Get(0).(func(*model.ListOptions) []*model.Forge); ok { + r0 = rf(p) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*model.Forge) + } + } + + if rf, ok := ret.Get(1).(func(*model.ListOptions) error); ok { + r1 = rf(p) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ForgeUpdate provides a mock function with given fields: _a0 +func (_m *Store) ForgeUpdate(_a0 *model.Forge) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(*model.Forge) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // GetActivePipelineList provides a mock function with given fields: repo func (_m *Store) GetActivePipelineList(repo *model.Repo) ([]*model.Pipeline, error) { ret := _m.Called(repo) diff --git a/server/store/store.go b/server/store/store.go index 4dc47b9fc..6ba76573c 100644 --- a/server/store/store.go +++ b/server/store/store.go @@ -14,7 +14,6 @@ package store -//go:generate go install github.com/vektra/mockery/v2@latest //go:generate mockery --name Store --output mocks --case underscore import ( @@ -160,6 +159,13 @@ type Store interface { CronListNextExecute(int64, int64) ([]*model.Cron, error) CronGetLock(*model.Cron, int64) (bool, error) + // Forge + ForgeCreate(*model.Forge) error + ForgeGet(int64) (*model.Forge, error) + ForgeList(p *model.ListOptions) ([]*model.Forge, error) + ForgeUpdate(*model.Forge) error + ForgeDelete(*model.Forge) error + // Agent AgentCreate(*model.Agent) error AgentFind(int64) (*model.Agent, error) diff --git a/server/web/config.go b/server/web/config.go index 630ae9ee4..99e78461e 100644 --- a/server/web/config.go +++ b/server/web/config.go @@ -39,12 +39,20 @@ func Config(c *gin.Context) { ).Sign(user.Hash) } + // TODO: remove this and use the forge type from the corresponding repo + mainForge, err := server.Config.Services.Manager.ForgeMain() + if err != nil { + log.Error().Err(err).Msg("could not get main forge") + c.AbortWithStatus(http.StatusInternalServerError) + return + } + configData := map[string]any{ "user": user, "csrf": csrf, "version": version.String(), "skip_version_check": server.Config.WebUI.SkipVersionCheck, - "forge": server.Config.Services.Forge.Name(), + "forge": mainForge.Name(), "root_path": server.Config.Server.RootPath, "enable_swagger": server.Config.WebUI.EnableSwagger, } diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 67de3b7bf..759f71457 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -135,7 +135,7 @@ devDependencies: version: 5.4.3 typescript-eslint: specifier: ^7.6.0 - version: 7.6.0(eslint@9.0.0)(typescript@5.4.3) + version: 7.7.0(eslint@9.0.0)(typescript@5.4.3) unplugin-icons: specifier: ^0.18.2 version: 0.18.5(@vue/compiler-sfc@3.4.21) @@ -1022,8 +1022,8 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@7.6.0(@typescript-eslint/parser@7.6.0)(eslint@9.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==} + /@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0)(eslint@9.0.0)(typescript@5.4.3): + resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1034,11 +1034,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.6.0(eslint@9.0.0)(typescript@5.4.3) - '@typescript-eslint/scope-manager': 7.6.0 - '@typescript-eslint/type-utils': 7.6.0(eslint@9.0.0)(typescript@5.4.3) - '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.6.0 + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/type-utils': 7.7.0(eslint@9.0.0)(typescript@5.4.3) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 9.0.0 graphemer: 1.4.0 @@ -1072,8 +1072,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.6.0(eslint@9.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==} + /@typescript-eslint/parser@7.7.0(eslint@9.0.0)(typescript@5.4.3): + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1082,10 +1082,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.6.0 - '@typescript-eslint/types': 7.6.0 - '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.3) - '@typescript-eslint/visitor-keys': 7.6.0 + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.3) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 9.0.0 typescript: 5.4.3 @@ -1101,12 +1101,12 @@ packages: '@typescript-eslint/visitor-keys': 7.4.0 dev: true - /@typescript-eslint/scope-manager@7.6.0: - resolution: {integrity: sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==} + /@typescript-eslint/scope-manager@7.7.0: + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.6.0 - '@typescript-eslint/visitor-keys': 7.6.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 dev: true /@typescript-eslint/type-utils@7.4.0(eslint@9.0.0)(typescript@5.4.3): @@ -1129,8 +1129,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@7.6.0(eslint@9.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==} + /@typescript-eslint/type-utils@7.7.0(eslint@9.0.0)(typescript@5.4.3): + resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1139,8 +1139,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.3) - '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.4.3) + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.3) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.3) debug: 4.3.4 eslint: 9.0.0 ts-api-utils: 1.3.0(typescript@5.4.3) @@ -1154,8 +1154,8 @@ packages: engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/types@7.6.0: - resolution: {integrity: sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==} + /@typescript-eslint/types@7.7.0: + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} engines: {node: ^18.18.0 || >=20.0.0} dev: true @@ -1181,8 +1181,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.6.0(typescript@5.4.3): - resolution: {integrity: sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==} + /@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.3): + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1190,8 +1190,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.6.0 - '@typescript-eslint/visitor-keys': 7.6.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1222,8 +1222,8 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.6.0(eslint@9.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==} + /@typescript-eslint/utils@7.7.0(eslint@9.0.0)(typescript@5.4.3): + resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1231,9 +1231,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.6.0 - '@typescript-eslint/types': 7.6.0 - '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.3) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.3) eslint: 9.0.0 semver: 7.6.0 transitivePeerDependencies: @@ -1249,11 +1249,11 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.6.0: - resolution: {integrity: sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==} + /@typescript-eslint/visitor-keys@7.7.0: + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/types': 7.7.0 eslint-visitor-keys: 3.4.3 dev: true @@ -3825,8 +3825,8 @@ packages: possible-typed-array-names: 1.0.0 dev: true - /typescript-eslint@7.6.0(eslint@9.0.0)(typescript@5.4.3): - resolution: {integrity: sha512-LY6vH6F1l5jpGqRtU+uK4+mOecIb4Cd4kaz1hAiJrgnNiHUA8wiw8BkJyYS+MRLM69F1QuSKwtGlQqnGl1Rc6w==} + /typescript-eslint@7.7.0(eslint@9.0.0)(typescript@5.4.3): + resolution: {integrity: sha512-wZZ+7mTQJCn4mGAvzdERtL4vwKGM/mF9cMSMeKUllz3Hgbd1Mdd5L60Q+nJmCio9RB4OyMMr0EX4Ry2Q7jiAyw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -3835,9 +3835,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@9.0.0)(typescript@5.4.3) - '@typescript-eslint/parser': 7.6.0(eslint@9.0.0)(typescript@5.4.3) - '@typescript-eslint/utils': 7.6.0(eslint@9.0.0)(typescript@5.4.3) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@9.0.0)(typescript@5.4.3) + '@typescript-eslint/parser': 7.7.0(eslint@9.0.0)(typescript@5.4.3) + '@typescript-eslint/utils': 7.7.0(eslint@9.0.0)(typescript@5.4.3) eslint: 9.0.0 typescript: 5.4.3 transitivePeerDependencies: diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json index 63c27116a..83e98c2d8 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -260,7 +260,6 @@ "log_auto_scroll_off": "Turn off automatic scrolling" }, "protected": { - "review": "Review changes", "awaits": "This pipeline is awaiting approval by a maintainer!", "approve": "Approve", "decline": "Decline", diff --git a/web/src/assets/locales/fr.json b/web/src/assets/locales/fr.json index 63c50b788..4760257d1 100644 --- a/web/src/assets/locales/fr.json +++ b/web/src/assets/locales/fr.json @@ -14,9 +14,9 @@ "desc": "Le nombre maximum de pipelines exécutées en parallèle par cet agent." }, "created": "Agent crée", - "delete_agent": "Effacer l'agent", - "delete_confirm": "Voulez vous vraiment effacer cet agent ? Il ne pourra plus se connecter sur le serveur.", - "deleted": "Agent effacé", + "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", "edit_agent": "Éditer l'agent", "id": "ID", @@ -43,9 +43,9 @@ }, "not_allowed": "Vous n'êtes pas autorisé à accéder aux réglages du serveur", "orgs": { - "delete_confirm": "Voulez-vous vraiment effacer cette organisation ? Cela supprimera tous les dépôts que possède cette organisation.", - "delete_org": "Effacer l'organisation", - "deleted": "Organisation effacée", + "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", "none": "Il n'y a pas encore d'organisation.", "org_settings": "Réglages de l'organisation", @@ -88,7 +88,7 @@ "secrets": { "add": "Ajouter un secret", "created": "Secret global crée", - "deleted": "Secret global effacé", + "deleted": "Secret global supprimé", "desc": "Les secrets globaux sont transmis sous forme de variable d’environnement lors de l’exécution de toutes les étapes d'un pipeline.", "events": { "events": "Disponible pour les événements suivants", @@ -119,8 +119,8 @@ "cancel": "Annuler", "created": "Compte utilisateur créé", "delete_confirm": "Voulez vous vraiment supprimer ce compte utilisateur ? Cela supprimera tout les dépôts que possède ce compte utilisateur.", - "delete_user": "Effacer le compte utilisateur", - "deleted": "Compte utilisateur effacé", + "delete_user": "Supprimer le compte utilisateur", + "deleted": "Compte utilisateur supprimé", "desc": "Utilisateurs enregistrés sur le serveur", "edit_user": "Éditer le compte utilisateur", "email": "Courriel", @@ -156,7 +156,7 @@ "secrets": { "add": "Ajouter un secret", "created": "Secret d'organisation crée", - "deleted": "Secret d'organisation effacé", + "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.", "events": { "events": "Disponible pour les événements suivants", @@ -195,7 +195,7 @@ "name": "Nom de la variable", "title": "Variables additionnelles du pipeline", "value": "Valeur de la variable", - "delete": "Effacer la variable" + "delete": "Supprimer la variable" } }, "enable": { @@ -216,7 +216,7 @@ "name": "Nom de la variable", "title": "Variables de pipeline supplémentaire", "value": "Valeur de la variable", - "delete": "Effacer la variable" + "delete": "Supprimer la variable" } }, "not_allowed": "Vous n'êtes pas autorisé à accéder à ce dépôt", @@ -231,7 +231,8 @@ "log_auto_scroll_off": "Désactiver le défilement automatique", "log_download": "Télécharger", "restart": "Redémarrer", - "restart_success": "Pipeline redémarré" + "restart_success": "Pipeline redémarré", + "log_delete": "Supprimer" }, "config": "Configuration", "errors": "Erreurs ({count})", @@ -281,7 +282,9 @@ "step_not_started": "L'étape n'a pas démarré encore.", "tasks": "Tâches", "warnings": "Avertissements ({count})", - "we_got_some_errors": "Oh non, il y a des erreurs !" + "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 ?" }, "pull_requests": "Pull requests", "settings": { @@ -289,8 +292,8 @@ "actions": "Actions", "delete": { "confirm": "Toutes les données vont être perdues aprés cette action ! ! !\n\nVoulez vous vraiment continuer ?", - "delete": "Effacer le dépôt", - "success": "Dépôt effacé" + "delete": "Supprimer le dépôt", + "success": "Dépôt supprimé" }, "disable": { "disable": "Désactiver le dépôt", @@ -321,8 +324,8 @@ }, "created": "Tâche planifiée crée", "crons": "Tâches planifiées", - "delete": "Effacer la tâche planifiée", - "deleted": "Tâche planifiée effacée", + "delete": "Supprimer la tâche planifiée", + "deleted": "Tâche planifiée supprimée", "desc": "Les tâches planifiées peuvent déclencher des pipelines à intervalles réguliers.", "edit": "Modifier la tâche planifiée", "name": { @@ -405,8 +408,8 @@ }, "created": "Authentifiant de connexion à un registre crée", "credentials": "Authentifiants de connexion à un registre", - "delete": "Effacer le registre", - "deleted": "Authentifiant de connexion à un registre effacé", + "delete": "Supprimer le registre", + "deleted": "Authentifiant de connexion à un registre supprimé", "desc": "Des authentifiants de connexion pour les registres peuvent être ajouté pour permettre d'utiliser des images privées pour vos pipelines.", "edit": "Modifier le registre", "none": "Il n'y a pas d’authentifiant de connexion à un registre pour le moment.", @@ -418,9 +421,9 @@ "secrets": { "add": "Ajouter un secret", "created": "Secret crée", - "delete": "Effacer le secret", - "delete_confirm": "Voulez vous vraiment effacer ce secret ?", - "deleted": "Secret effacé", + "delete": "Supprimer le secret", + "delete_confirm": "Voulez vous vraiment supprimer ce secret ?", + "deleted": "Secret supprimé", "desc": "Les secrets sont transmis sous forme de variable d’environnement lors de l’exécution d'une étape d'un pipeline.", "edit": "Modifier le secret", "events": { @@ -490,7 +493,7 @@ "secrets": { "add": "Ajouter un secret", "created": "Secret d'utilisateur crée", - "deleted": "Secret d'utilisateur effacé", + "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.", "events": { "events": "Disponible pour les événements suivants", diff --git a/web/src/views/repo/RepoWrapper.vue b/web/src/views/repo/RepoWrapper.vue index c392f9ac7..a56db15f9 100644 --- a/web/src/views/repo/RepoWrapper.vue +++ b/web/src/views/repo/RepoWrapper.vue @@ -77,7 +77,7 @@ const router = useRouter(); const i18n = useI18n(); const config = useConfig(); -const { forge } = useConfig(); +const { forge } = useConfig(); // TODO: remove this and use the forge type from the corresponding repo const repo = repoStore.getRepo(repositoryId); const repoPermissions = ref(); const pipelines = pipelineStore.getRepoPipelines(repositoryId); diff --git a/web/src/views/repo/pipeline/Pipeline.vue b/web/src/views/repo/pipeline/Pipeline.vue index cbbd1d85a..096d904a1 100644 --- a/web/src/views/repo/pipeline/Pipeline.vue +++ b/web/src/views/repo/pipeline/Pipeline.vue @@ -34,13 +34,6 @@ {{ $t('repo.pipeline.protected.awaits') }}
-