diff --git a/.woodpecker/docs.yaml b/.woodpecker/docs.yaml index bc2849f05..979fb4f2a 100644 --- a/.woodpecker/docs.yaml +++ b/.woodpecker/docs.yaml @@ -59,7 +59,7 @@ steps: - event: manual deploy-preview: - image: docker.io/woodpeckerci/plugin-surge-preview:1.3.2 + image: docker.io/woodpeckerci/plugin-surge-preview:1.3.3 settings: path: 'docs/build/' surge_token: diff --git a/.woodpecker/release-helper.yaml b/.woodpecker/release-helper.yaml index 4697ab2da..808bbb4ce 100644 --- a/.woodpecker/release-helper.yaml +++ b/.woodpecker/release-helper.yaml @@ -1,6 +1,6 @@ steps: - name: release-helper - image: docker.io/woodpeckerci/plugin-ready-release-go:2.1.1 + image: docker.io/woodpeckerci/plugin-ready-release-go:3.0.0 settings: release_branch: ${CI_COMMIT_BRANCH} forge_type: github diff --git a/cli/admin/admin.go b/cli/admin/admin.go index f96c5fd0b..f99b79f0f 100644 --- a/cli/admin/admin.go +++ b/cli/admin/admin.go @@ -28,9 +28,9 @@ var Command = &cli.Command{ Name: "admin", Usage: "manage server settings", Commands: []*cli.Command{ - secret.Command, - registry.Command, - user.Command, loglevel.Command, + registry.Command, + secret.Command, + user.Command, }, } diff --git a/cli/admin/loglevel/loglevel.go b/cli/admin/loglevel/loglevel.go index 947e99eaf..323974d01 100644 --- a/cli/admin/loglevel/loglevel.go +++ b/cli/admin/loglevel/loglevel.go @@ -29,7 +29,7 @@ import ( var Command = &cli.Command{ Name: "log-level", ArgsUsage: "[level]", - Usage: "get the logging level of the server, or set it with [level]", + Usage: "retrieve log level from server, or set it with [level]", Action: logLevel, } @@ -59,6 +59,6 @@ func logLevel(ctx context.Context, c *cli.Command) error { } } - log.Info().Msgf("logging level: %s", ll.Level) + log.Info().Msgf("log level: %s", ll.Level) return nil } diff --git a/cli/admin/registry/registry.go b/cli/admin/registry/registry.go index 3d9c4de50..7055c2873 100644 --- a/cli/admin/registry/registry.go +++ b/cli/admin/registry/registry.go @@ -25,8 +25,8 @@ var Command = &cli.Command{ Commands: []*cli.Command{ registryCreateCmd, registryDeleteCmd, - registryUpdateCmd, - registryInfoCmd, registryListCmd, + registryShowCmd, + registryUpdateCmd, }, } diff --git a/cli/admin/registry/registry_add.go b/cli/admin/registry/registry_add.go index a378a8a2f..b09f8a74e 100644 --- a/cli/admin/registry/registry_add.go +++ b/cli/admin/registry/registry_add.go @@ -27,7 +27,7 @@ import ( var registryCreateCmd = &cli.Command{ Name: "add", - Usage: "adds a registry", + Usage: "add a registry", Action: registryCreate, Flags: []cli.Flag{ &cli.StringFlag{ diff --git a/cli/admin/registry/registry_info.go b/cli/admin/registry/registry_show.go similarity index 88% rename from cli/admin/registry/registry_info.go rename to cli/admin/registry/registry_show.go index 80b78546f..c7ae1359d 100644 --- a/cli/admin/registry/registry_info.go +++ b/cli/admin/registry/registry_show.go @@ -25,10 +25,10 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/internal" ) -var registryInfoCmd = &cli.Command{ - Name: "info", - Usage: "display registry info", - Action: registryInfo, +var registryShowCmd = &cli.Command{ + Name: "show", + Usage: "show registry information", + Action: registryShow, Flags: []cli.Flag{ &cli.StringFlag{ Name: "hostname", @@ -39,7 +39,7 @@ var registryInfoCmd = &cli.Command{ }, } -func registryInfo(ctx context.Context, c *cli.Command) error { +func registryShow(ctx context.Context, c *cli.Command) error { var ( hostname = c.String("hostname") format = c.String("format") + "\n" diff --git a/cli/admin/secret/secret.go b/cli/admin/secret/secret.go index ffd466f94..da805a98e 100644 --- a/cli/admin/secret/secret.go +++ b/cli/admin/secret/secret.go @@ -25,8 +25,8 @@ var Command = &cli.Command{ Commands: []*cli.Command{ secretCreateCmd, secretDeleteCmd, - secretUpdateCmd, - secretInfoCmd, secretListCmd, + secretShowCmd, + secretUpdateCmd, }, } diff --git a/cli/admin/secret/secret_add.go b/cli/admin/secret/secret_add.go index f2cf88c8c..07afa8134 100644 --- a/cli/admin/secret/secret_add.go +++ b/cli/admin/secret/secret_add.go @@ -27,7 +27,7 @@ import ( var secretCreateCmd = &cli.Command{ Name: "add", - Usage: "adds a secret", + Usage: "add a secret", ArgsUsage: "[repo-id|repo-full-name]", Action: secretCreate, Flags: []cli.Flag{ diff --git a/cli/admin/secret/secret_info.go b/cli/admin/secret/secret_show.go similarity index 88% rename from cli/admin/secret/secret_info.go rename to cli/admin/secret/secret_show.go index 7efdacc25..09ce610b8 100644 --- a/cli/admin/secret/secret_info.go +++ b/cli/admin/secret/secret_show.go @@ -26,11 +26,11 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/internal" ) -var secretInfoCmd = &cli.Command{ - Name: "info", - Usage: "display secret info", +var secretShowCmd = &cli.Command{ + Name: "show", + Usage: "show secret information", ArgsUsage: "[repo-id|repo-full-name]", - Action: secretInfo, + Action: secretShow, Flags: []cli.Flag{ &cli.StringFlag{ Name: "name", @@ -40,7 +40,7 @@ var secretInfoCmd = &cli.Command{ }, } -func secretInfo(ctx context.Context, c *cli.Command) error { +func secretShow(ctx context.Context, c *cli.Command) error { var ( secretName = c.String("name") format = c.String("format") + "\n" diff --git a/cli/admin/user/user.go b/cli/admin/user/user.go index 78b552b36..29951a635 100644 --- a/cli/admin/user/user.go +++ b/cli/admin/user/user.go @@ -23,9 +23,9 @@ var Command = &cli.Command{ Name: "user", Usage: "manage users", Commands: []*cli.Command{ - userListCmd, - userInfoCmd, userAddCmd, + userListCmd, userRemoveCmd, + userShowCmd, }, } diff --git a/cli/admin/user/user_add.go b/cli/admin/user/user_add.go index 80012158e..b05b5f6a9 100644 --- a/cli/admin/user/user_add.go +++ b/cli/admin/user/user_add.go @@ -26,7 +26,7 @@ import ( var userAddCmd = &cli.Command{ Name: "add", - Usage: "adds a user", + Usage: "add a user", ArgsUsage: "", Action: userAdd, } diff --git a/cli/admin/user/user_info.go b/cli/admin/user/user_show.go similarity index 88% rename from cli/admin/user/user_info.go rename to cli/admin/user/user_show.go index bfebed93f..6ed453fc8 100644 --- a/cli/admin/user/user_info.go +++ b/cli/admin/user/user_show.go @@ -26,15 +26,15 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/internal" ) -var userInfoCmd = &cli.Command{ - Name: "info", - Usage: "show user details", +var userShowCmd = &cli.Command{ + Name: "show", + Usage: "show user information", ArgsUsage: "", - Action: userInfo, + Action: userShow, Flags: []cli.Flag{common.FormatFlag(tmplUserInfo)}, } -func userInfo(ctx context.Context, c *cli.Command) error { +func userShow(ctx context.Context, c *cli.Command) error { client, err := internal.NewClient(ctx, c) if err != nil { return err diff --git a/cli/common/hooks.go b/cli/common/hooks.go index 9ff74d1ad..d35dd2fd6 100644 --- a/cli/common/hooks.go +++ b/cli/common/hooks.go @@ -35,18 +35,18 @@ func Before(ctx context.Context, c *cli.Command) (context.Context, error) { waitForUpdateCheck, cancelWaitForUpdate = context.WithCancelCause(context.Background()) defer cancelWaitForUpdate(errors.New("update check finished")) - log.Debug().Msg("Checking for updates ...") + log.Debug().Msg("checking for updates ...") newVersion, err := update.CheckForUpdate(waitForUpdateCheck, false) //nolint:contextcheck if err != nil { - log.Error().Err(err).Msgf("Failed to check for updates") + log.Error().Err(err).Msgf("failed to check for updates") return } if newVersion != nil { - log.Warn().Msgf("A new version of woodpecker-cli is available: %s. Update by running: %s update", newVersion.Version, c.Root().Name) + log.Warn().Msgf("new version of woodpecker-cli is available: %s, update with: %s update", newVersion.Version, c.Root().Name) } else { - log.Debug().Msgf("No update required") + log.Debug().Msgf("no update required") } }(ctx) @@ -59,7 +59,7 @@ func After(_ context.Context, _ *cli.Command) error { case <-waitForUpdateCheck.Done(): // 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") + 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 817a859c3..274572c67 100644 --- a/cli/internal/config/config.go +++ b/cli/internal/config/config.go @@ -44,7 +44,7 @@ func Load(ctx context.Context, c *cli.Command) 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.") + log.Info().Msg("woodpecker-cli is not set up, run `woodpecker-cli setup` or provide required environment variables/flags") return errors.New("woodpecker-cli is not configured") } @@ -63,7 +63,7 @@ func Load(ctx context.Context, c *cli.Command) error { return err } - log.Debug().Any("config", config).Msg("Loaded config") + log.Debug().Any("config", config).Msg("loaded config") return nil } @@ -93,16 +93,16 @@ func Get(_ context.Context, c *cli.Command, _configPath string) (*Config, error) return nil, err } - log.Debug().Str("configPath", configPath).Msg("Checking for config file") + log.Debug().Str("configPath", configPath).Msg("checking for config file") content, err := os.ReadFile(configPath) switch { case err != nil && !os.IsNotExist(err): - log.Debug().Err(err).Msg("Failed to read the config file") + log.Debug().Err(err).Msg("failed to read the config file") return nil, err case err != nil && os.IsNotExist(err): - log.Debug().Msg("The config file does not exist") + log.Debug().Msg("config file does not exist") default: configFromFile := &Config{} @@ -111,7 +111,7 @@ func Get(_ context.Context, c *cli.Command, _configPath string) (*Config, error) return nil, err } conf.MergeIfNotSet(configFromFile) - log.Debug().Msg("Loaded config from file") + log.Debug().Msg("loaded config from file") } // if server or token are explicitly set, use them @@ -123,11 +123,11 @@ func Get(_ context.Context, c *cli.Command, _configPath string) (*Config, error) service := c.Root().Name secret, err := keyring.Get(service, conf.ServerURL) if errors.Is(err, keyring.ErrUnsupportedPlatform) { - log.Warn().Msg("Keyring is not supported on this platform") + log.Warn().Msg("keyring is not supported on this platform") return conf, nil } if errors.Is(err, keyring.ErrNotFound) { - log.Warn().Msg("Token not found in keyring") + log.Warn().Msg("token not found in keyring") return conf, nil } conf.Token = secret diff --git a/cli/lint/lint.go b/cli/lint/lint.go index 3872ef093..b52175daa 100644 --- a/cli/lint/lint.go +++ b/cli/lint/lint.go @@ -40,12 +40,12 @@ var Command = &cli.Command{ &cli.StringSliceFlag{ Sources: cli.EnvVars("WOODPECKER_PLUGINS_PRIVILEGED"), Name: "plugins-privileged", - Usage: "Allow plugins to run in privileged mode, if environment variable is defined but empty there will be none", + Usage: "allow plugins to run in privileged mode, if set empty, there is no", }, &cli.StringSliceFlag{ Sources: cli.EnvVars("WOODPECKER_PLUGINS_TRUSTED_CLONE"), Name: "plugins-trusted-clone", - Usage: "Plugins which are trusted to handle Git credentials in clone steps", + Usage: "plugins that are trusted to handle Git credentials in cloning steps", Value: constant.TrustedClonePlugins, }, &cli.BoolFlag{ diff --git a/cli/org/registry/registry.go b/cli/org/registry/registry.go index aa4f9f23b..38ca0454e 100644 --- a/cli/org/registry/registry.go +++ b/cli/org/registry/registry.go @@ -29,9 +29,9 @@ var Command = &cli.Command{ Commands: []*cli.Command{ registryCreateCmd, registryDeleteCmd, - registryUpdateCmd, - registryInfoCmd, registryListCmd, + registryShowCmd, + registryUpdateCmd, }, } diff --git a/cli/org/registry/registry_add.go b/cli/org/registry/registry_add.go index d82859f00..e6b184bcf 100644 --- a/cli/org/registry/registry_add.go +++ b/cli/org/registry/registry_add.go @@ -28,7 +28,7 @@ import ( var registryCreateCmd = &cli.Command{ Name: "add", - Usage: "adds a registry", + Usage: "add a registry", ArgsUsage: "[org-id|org-full-name]", Action: registryCreate, Flags: []cli.Flag{ diff --git a/cli/org/registry/registry_info.go b/cli/org/registry/registry_show.go similarity index 88% rename from cli/org/registry/registry_info.go rename to cli/org/registry/registry_show.go index 752c54c18..8fd7a77f0 100644 --- a/cli/org/registry/registry_info.go +++ b/cli/org/registry/registry_show.go @@ -25,11 +25,11 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/internal" ) -var registryInfoCmd = &cli.Command{ - Name: "info", - Usage: "display registry info", +var registryShowCmd = &cli.Command{ + Name: "show", + Usage: "show registry information", ArgsUsage: "[org-id|org-full-name]", - Action: registryInfo, + Action: registryShow, Flags: []cli.Flag{ common.OrgFlag, &cli.StringFlag{ @@ -41,7 +41,7 @@ var registryInfoCmd = &cli.Command{ }, } -func registryInfo(ctx context.Context, c *cli.Command) error { +func registryShow(ctx context.Context, c *cli.Command) error { var ( hostname = c.String("hostname") format = c.String("format") + "\n" diff --git a/cli/org/secret/secret.go b/cli/org/secret/secret.go index 11206be53..b50880c91 100644 --- a/cli/org/secret/secret.go +++ b/cli/org/secret/secret.go @@ -29,9 +29,9 @@ var Command = &cli.Command{ Commands: []*cli.Command{ secretCreateCmd, secretDeleteCmd, - secretUpdateCmd, - secretInfoCmd, secretListCmd, + secretShowCmd, + secretUpdateCmd, }, } diff --git a/cli/org/secret/secret_add.go b/cli/org/secret/secret_add.go index 97b901cdd..d356773f1 100644 --- a/cli/org/secret/secret_add.go +++ b/cli/org/secret/secret_add.go @@ -28,7 +28,7 @@ import ( var secretCreateCmd = &cli.Command{ Name: "add", - Usage: "adds a secret", + Usage: "add a secret", ArgsUsage: "[repo-id|repo-full-name]", Action: secretCreate, Flags: []cli.Flag{ diff --git a/cli/org/secret/secret_set.go b/cli/org/secret/secret_set.go index 2e25655aa..4357d3296 100644 --- a/cli/org/secret/secret_set.go +++ b/cli/org/secret/secret_set.go @@ -43,11 +43,11 @@ var secretUpdateCmd = &cli.Command{ }, &cli.StringSliceFlag{ Name: "event", - Usage: "secret limited to these events", + Usage: "limit secret to these event", }, &cli.StringSliceFlag{ Name: "image", - Usage: "secret limited to these images", + Usage: "limit secret to these image", }, }, } diff --git a/cli/org/secret/secret_info.go b/cli/org/secret/secret_show.go similarity index 89% rename from cli/org/secret/secret_info.go rename to cli/org/secret/secret_show.go index 8025a977f..9a78741c2 100644 --- a/cli/org/secret/secret_info.go +++ b/cli/org/secret/secret_show.go @@ -26,11 +26,11 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/internal" ) -var secretInfoCmd = &cli.Command{ - Name: "info", - Usage: "display secret info", +var secretShowCmd = &cli.Command{ + Name: "show", + Usage: "show secret information", ArgsUsage: "[repo-id|repo-full-name]", - Action: secretInfo, + Action: secretShow, Flags: []cli.Flag{ common.OrgFlag, &cli.StringFlag{ @@ -41,7 +41,7 @@ var secretInfoCmd = &cli.Command{ }, } -func secretInfo(ctx context.Context, c *cli.Command) error { +func secretShow(ctx context.Context, c *cli.Command) error { var ( secretName = c.String("name") format = c.String("format") + "\n" diff --git a/cli/pipeline/create.go b/cli/pipeline/create.go index e343c24a0..7f079f818 100644 --- a/cli/pipeline/create.go +++ b/cli/pipeline/create.go @@ -74,5 +74,5 @@ func pipelineCreate(ctx context.Context, c *cli.Command) error { return err } - return pipelineOutput(c, []woodpecker.Pipeline{*pipeline}) + return pipelineOutput(c, []*woodpecker.Pipeline{pipeline}) } diff --git a/cli/pipeline/deploy/deploy.go b/cli/pipeline/deploy/deploy.go index 8a742fc8a..199310ac6 100644 --- a/cli/pipeline/deploy/deploy.go +++ b/cli/pipeline/deploy/deploy.go @@ -53,7 +53,7 @@ var Command = &cli.Command{ &cli.StringSliceFlag{ Name: "param", Aliases: []string{"p"}, - Usage: "custom parameters to be injected into the step environment. Format: KEY=value", + Usage: "custom parameters to inject into the step environment. Format: KEY=value", }, }, } diff --git a/cli/pipeline/kill.go b/cli/pipeline/kill.go index 872719765..839d7c75e 100644 --- a/cli/pipeline/kill.go +++ b/cli/pipeline/kill.go @@ -48,7 +48,7 @@ func pipelineKill(ctx context.Context, c *cli.Command) (err error) { return err } - err = client.PipelineKill(repoID, number) + err = client.PipelineDelete(repoID, number) if err != nil { return err } diff --git a/cli/pipeline/last.go b/cli/pipeline/last.go index 131c20902..68e6cbb2f 100644 --- a/cli/pipeline/last.go +++ b/cli/pipeline/last.go @@ -26,7 +26,7 @@ import ( var pipelineLastCmd = &cli.Command{ Name: "last", - Usage: "show latest pipeline details", + Usage: "show latest pipeline information", ArgsUsage: "", Action: pipelineLast, Flags: append(common.OutputFlags("table"), []cli.Flag{ @@ -58,5 +58,5 @@ func pipelineLast(ctx context.Context, c *cli.Command) error { return err } - return pipelineOutput(c, []woodpecker.Pipeline{*pipeline}) + return pipelineOutput(c, []*woodpecker.Pipeline{pipeline}) } diff --git a/cli/pipeline/list.go b/cli/pipeline/list.go index ceadc9777..930e0e84f 100644 --- a/cli/pipeline/list.go +++ b/cli/pipeline/list.go @@ -22,6 +22,7 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/common" "go.woodpecker-ci.org/woodpecker/v2/cli/internal" + shared_utils "go.woodpecker-ci.org/woodpecker/v2/shared/utils" "go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" ) @@ -52,7 +53,7 @@ func buildPipelineListCmd() *cli.Command { }, &cli.TimestampFlag{ Name: "before", - Usage: "only return pipelines before this RFC3339 date", + Usage: "only return pipelines before this date (RFC3339)", Config: cli.TimestampConfig{ Layouts: []string{ time.RFC3339, @@ -61,7 +62,7 @@ func buildPipelineListCmd() *cli.Command { }, &cli.TimestampFlag{ Name: "after", - Usage: "only return pipelines after this RFC3339 date", + Usage: "only return pipelines after this date (RFC3339)", Config: cli.TimestampConfig{ Layouts: []string{ time.RFC3339, @@ -77,60 +78,51 @@ func List(ctx context.Context, c *cli.Command) error { if err != nil { return err } - resources, err := pipelineList(ctx, c, client) + pipelines, err := pipelineList(c, client) if err != nil { return err } - return pipelineOutput(c, resources) + return pipelineOutput(c, pipelines) } -func pipelineList(_ context.Context, c *cli.Command, client woodpecker.Client) ([]woodpecker.Pipeline, error) { - resources := make([]woodpecker.Pipeline, 0) - +func pipelineList(c *cli.Command, client woodpecker.Client) ([]*woodpecker.Pipeline, error) { repoIDOrFullName := c.Args().First() repoID, err := internal.ParseRepo(client, repoIDOrFullName) if err != nil { - return resources, err + return nil, err } opt := woodpecker.PipelineListOptions{} - before := c.Timestamp("before") - after := c.Timestamp("after") - if !before.IsZero() { + if before := c.Timestamp("before"); !before.IsZero() { opt.Before = before } - if !after.IsZero() { + if after := c.Timestamp("after"); !after.IsZero() { opt.After = after } - pipelines, err := client.PipelineList(repoID, opt) - if err != nil { - return resources, err - } - branch := c.String("branch") event := c.String("event") status := c.String("status") limit := int(c.Int("limit")) - var count int - for _, pipeline := range pipelines { - if count >= limit { - break - } - if branch != "" && pipeline.Branch != branch { - continue - } - if event != "" && pipeline.Event != event { - continue - } - if status != "" && pipeline.Status != status { - continue - } - resources = append(resources, *pipeline) - count++ + pipelines, err := shared_utils.Paginate(func(page int) ([]*woodpecker.Pipeline, error) { + return client.PipelineList(repoID, + woodpecker.PipelineListOptions{ + ListOptions: woodpecker.ListOptions{ + Page: page, + }, + Before: opt.Before, + After: opt.After, + Branch: branch, + Events: []string{event}, + Status: status, + }, + ) + }, limit) + if err != nil { + return nil, err } - return resources, nil + return pipelines, nil } diff --git a/cli/pipeline/list_test.go b/cli/pipeline/list_test.go index 20ebefb30..4668b2fb3 100644 --- a/cli/pipeline/list_test.go +++ b/cli/pipeline/list_test.go @@ -22,7 +22,7 @@ func TestPipelineList(t *testing.T) { pipelines []*woodpecker.Pipeline pipelineErr error args []string - expected []woodpecker.Pipeline + expected []*woodpecker.Pipeline wantErr error }{ { @@ -34,53 +34,12 @@ func TestPipelineList(t *testing.T) { {ID: 3, Branch: "main", Event: "push", Status: "failure"}, }, args: []string{"ls", "repo/name"}, - expected: []woodpecker.Pipeline{ + expected: []*woodpecker.Pipeline{ {ID: 1, Branch: "main", Event: "push", Status: "success"}, {ID: 2, Branch: "develop", Event: "pull_request", Status: "running"}, {ID: 3, Branch: "main", Event: "push", Status: "failure"}, }, }, - { - name: "filter by branch", - repoID: 1, - pipelines: []*woodpecker.Pipeline{ - {ID: 1, Branch: "main", Event: "push", Status: "success"}, - {ID: 2, Branch: "develop", Event: "pull_request", Status: "running"}, - {ID: 3, Branch: "main", Event: "push", Status: "failure"}, - }, - args: []string{"ls", "--branch", "main", "repo/name"}, - expected: []woodpecker.Pipeline{ - {ID: 1, Branch: "main", Event: "push", Status: "success"}, - {ID: 3, Branch: "main", Event: "push", Status: "failure"}, - }, - }, - { - name: "filter by event", - repoID: 1, - pipelines: []*woodpecker.Pipeline{ - {ID: 1, Branch: "main", Event: "push", Status: "success"}, - {ID: 2, Branch: "develop", Event: "pull_request", Status: "running"}, - {ID: 3, Branch: "main", Event: "push", Status: "failure"}, - }, - args: []string{"ls", "--event", "push", "repo/name"}, - expected: []woodpecker.Pipeline{ - {ID: 1, Branch: "main", Event: "push", Status: "success"}, - {ID: 3, Branch: "main", Event: "push", Status: "failure"}, - }, - }, - { - name: "filter by status", - repoID: 1, - pipelines: []*woodpecker.Pipeline{ - {ID: 1, Branch: "main", Event: "push", Status: "success"}, - {ID: 2, Branch: "develop", Event: "pull_request", Status: "running"}, - {ID: 3, Branch: "main", Event: "push", Status: "failure"}, - }, - args: []string{"ls", "--status", "success", "repo/name"}, - expected: []woodpecker.Pipeline{ - {ID: 1, Branch: "main", Event: "push", Status: "success"}, - }, - }, { name: "limit results", repoID: 1, @@ -90,7 +49,7 @@ func TestPipelineList(t *testing.T) { {ID: 3, Branch: "main", Event: "push", Status: "failure"}, }, args: []string{"ls", "--limit", "2", "repo/name"}, - expected: []woodpecker.Pipeline{ + expected: []*woodpecker.Pipeline{ {ID: 1, Branch: "main", Event: "push", Status: "success"}, {ID: 2, Branch: "develop", Event: "pull_request", Status: "running"}, }, @@ -107,13 +66,21 @@ func TestPipelineList(t *testing.T) { for _, tt := range testtases { t.Run(tt.name, func(t *testing.T) { mockClient := mocks.NewClient(t) - mockClient.On("PipelineList", mock.Anything, mock.Anything).Return(tt.pipelines, tt.pipelineErr) + mockClient.On("PipelineList", mock.Anything, mock.Anything).Return(func(_ int64, opt woodpecker.PipelineListOptions) ([]*woodpecker.Pipeline, error) { + if tt.pipelineErr != nil { + return nil, tt.pipelineErr + } + if opt.Page == 1 { + return tt.pipelines, nil + } + return []*woodpecker.Pipeline{}, nil + }).Maybe() mockClient.On("RepoLookup", mock.Anything).Return(&woodpecker.Repo{ID: tt.repoID}, nil) command := buildPipelineListCmd() command.Writer = io.Discard - command.Action = func(ctx context.Context, c *cli.Command) error { - pipelines, err := pipelineList(ctx, c, mockClient) + command.Action = func(_ context.Context, c *cli.Command) error { + pipelines, err := pipelineList(c, mockClient) if tt.wantErr != nil { assert.EqualError(t, err, tt.wantErr.Error()) return nil diff --git a/cli/pipeline/log/log.go b/cli/pipeline/log/log.go index 2ca1e1c90..4227288dc 100644 --- a/cli/pipeline/log/log.go +++ b/cli/pipeline/log/log.go @@ -24,5 +24,6 @@ var Command = &cli.Command{ Usage: "manage logs", Commands: []*cli.Command{ logPurgeCmd, + logShowCmd, }, } diff --git a/cli/pipeline/logs.go b/cli/pipeline/log/log_show.go similarity index 84% rename from cli/pipeline/logs.go rename to cli/pipeline/log/log_show.go index f7725bc46..e9de7a747 100644 --- a/cli/pipeline/logs.go +++ b/cli/pipeline/log/log_show.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package pipeline +package log import ( "context" @@ -27,14 +27,14 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" ) -var pipelineLogsCmd = &cli.Command{ - Name: "logs", +var logShowCmd = &cli.Command{ + Name: "show", Usage: "show pipeline logs", ArgsUsage: " [step-number|step-name]", - Action: pipelineLogs, + Action: logShow, } -func pipelineLogs(ctx context.Context, c *cli.Command) error { +func logShow(ctx context.Context, c *cli.Command) error { repoIDOrFullName := c.Args().First() client, err := internal.NewClient(ctx, c) if err != nil { @@ -59,17 +59,17 @@ func pipelineLogs(ctx context.Context, c *cli.Command) error { stepArg := c.Args().Get(2) //nolint:mnd if len(stepArg) == 0 { - return showPipelineLog(client, repoID, number) + return pipelineLog(client, repoID, number) } step, err := internal.ParseStep(client, repoID, number, stepArg) if err != nil { return fmt.Errorf("invalid step '%s': %w", stepArg, err) } - return showStepLog(client, repoID, number, step) + return stepLog(client, repoID, number, step) } -func showPipelineLog(client woodpecker.Client, repoID, number int64) error { +func pipelineLog(client woodpecker.Client, repoID, number int64) error { pipeline, err := client.Pipeline(repoID, number) if err != nil { return err @@ -85,7 +85,7 @@ func showPipelineLog(client woodpecker.Client, repoID, number int64) error { if err := tmpl.Execute(os.Stdout, map[string]any{"workflow": workflow, "step": step}); err != nil { return err } - err := showStepLog(client, repoID, number, step.ID) + err := stepLog(client, repoID, number, step.ID) if err != nil { return err } @@ -95,7 +95,7 @@ func showPipelineLog(client woodpecker.Client, repoID, number int64) error { return nil } -func showStepLog(client woodpecker.Client, repoID, number, step int64) error { +func stepLog(client woodpecker.Client, repoID, number, step int64) error { logs, err := client.StepLogEntries(repoID, number, step) if err != nil { return err diff --git a/cli/pipeline/pipeline.go b/cli/pipeline/pipeline.go index c49107652..04bd256df 100644 --- a/cli/pipeline/pipeline.go +++ b/cli/pipeline/pipeline.go @@ -33,24 +33,24 @@ var Command = &cli.Command{ Name: "pipeline", Usage: "manage pipelines", Commands: []*cli.Command{ - buildPipelineListCmd(), - pipelineLastCmd, - pipelineLogsCmd, - pipelineInfoCmd, - pipelineStopCmd, - pipelineStartCmd, pipelineApproveCmd, - pipelineDeclineCmd, - pipelineQueueCmd, - pipelineKillCmd, - pipelinePsCmd, pipelineCreateCmd, - log.Command, + pipelineDeclineCmd, deploy.Command, + pipelineKillCmd, + pipelineLastCmd, + buildPipelineListCmd(), + log.Command, + pipelinePsCmd, + pipelinePurgeCmd, + pipelineQueueCmd, + pipelineShowCmd, + pipelineStartCmd, + pipelineStopCmd, }, } -func pipelineOutput(c *cli.Command, resources []woodpecker.Pipeline, fd ...io.Writer) error { +func pipelineOutput(c *cli.Command, pipelines []*woodpecker.Pipeline, fd ...io.Writer) error { outFmt, outOpt := output.ParseOutputOptions(c.String("output")) noHeader := c.Bool("output-no-headers") @@ -74,7 +74,7 @@ func pipelineOutput(c *cli.Command, resources []woodpecker.Pipeline, fd ...io.Wr if err != nil { return err } - if err := tmpl.Execute(out, resources); err != nil { + if err := tmpl.Execute(out, pipelines); err != nil { return err } case "table": @@ -89,7 +89,7 @@ func pipelineOutput(c *cli.Command, resources []woodpecker.Pipeline, fd ...io.Wr if !noHeader { table.WriteHeader(cols) } - for _, resource := range resources { + for _, resource := range pipelines { if err := table.Write(cols, resource); err != nil { return err } diff --git a/cli/pipeline/pipeline_test.go b/cli/pipeline/pipeline_test.go index ce69e5946..4bbe52b31 100644 --- a/cli/pipeline/pipeline_test.go +++ b/cli/pipeline/pipeline_test.go @@ -47,7 +47,7 @@ func TestPipelineOutput(t *testing.T) { }, } - pipelines := []woodpecker.Pipeline{ + pipelines := []*woodpecker.Pipeline{ { Number: 1, Status: "success", diff --git a/cli/pipeline/purge.go b/cli/pipeline/purge.go new file mode 100644 index 000000000..a9c5e39d1 --- /dev/null +++ b/cli/pipeline/purge.go @@ -0,0 +1,157 @@ +// 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 pipeline + +import ( + "context" + "fmt" + "time" + + "github.com/rs/zerolog/log" + "github.com/urfave/cli/v3" + + "go.woodpecker-ci.org/woodpecker/v2/cli/internal" + shared_utils "go.woodpecker-ci.org/woodpecker/v2/shared/utils" + "go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" +) + +//nolint:mnd +var pipelinePurgeCmd = &cli.Command{ + Name: "purge", + Usage: "purge pipelines", + ArgsUsage: "", + Action: Purge, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "older-than", + Usage: "remove pipelines older than the specified time limit", + Required: true, + }, + &cli.IntFlag{ + Name: "keep-min", + Usage: "minimum number of pipelines to keep", + Value: 10, + }, + &cli.BoolFlag{ + Name: "dry-run", + Usage: "disable non-read api calls", + Value: false, + }, + }, +} + +func Purge(ctx context.Context, c *cli.Command) error { + client, err := internal.NewClient(ctx, c) + if err != nil { + return err + } + return pipelinePurge(c, client) +} + +func pipelinePurge(c *cli.Command, client woodpecker.Client) (err error) { + repoIDOrFullName := c.Args().First() + if len(repoIDOrFullName) == 0 { + return fmt.Errorf("missing required argument repo-id / repo-full-name") + } + repoID, err := internal.ParseRepo(client, repoIDOrFullName) + if err != nil { + return fmt.Errorf("invalid repo '%s': %w", repoIDOrFullName, err) + } + + olderThan := c.String("older-than") + keepMin := c.Int("keep-min") + dryRun := c.Bool("dry-run") + + duration, err := time.ParseDuration(olderThan) + if err != nil { + return err + } + + var pipelinesKeep []*woodpecker.Pipeline + + if keepMin > 0 { + pipelinesKeep, err = fetchPipelinesToKeep(client, repoID, int(keepMin)) + if err != nil { + return err + } + } + + pipelines, err := fetchPipelines(client, repoID, duration) + if err != nil { + return err + } + + // Create a map of pipeline IDs to keep + keepMap := make(map[int64]struct{}) + for _, p := range pipelinesKeep { + keepMap[p.ID] = struct{}{} + } + + // Filter pipelines to only include those not in keepMap + var pipelinesToPurge []*woodpecker.Pipeline + for _, p := range pipelines { + if _, exists := keepMap[p.ID]; !exists { + pipelinesToPurge = append(pipelinesToPurge, p) + } + } + + msgPrefix := "" + if dryRun { + msgPrefix = "DRY-RUN: " + } + + for i, p := range pipelinesToPurge { + // cspell:words spurge + log.Debug().Msgf("%spurge %v/%v pipelines from repo '%v'", msgPrefix, i+1, len(pipelinesToPurge), repoIDOrFullName) + if dryRun { + continue + } + + err := client.PipelineDelete(repoID, p.ID) + if err != nil { + return err + } + } + + return nil +} + +func fetchPipelinesToKeep(client woodpecker.Client, repoID int64, keepMin int) ([]*woodpecker.Pipeline, error) { + if keepMin <= 0 { + return nil, nil + } + return shared_utils.Paginate(func(page int) ([]*woodpecker.Pipeline, error) { + return client.PipelineList(repoID, + woodpecker.PipelineListOptions{ + ListOptions: woodpecker.ListOptions{ + Page: page, + }, + }, + ) + }, keepMin) +} + +func fetchPipelines(client woodpecker.Client, repoID int64, duration time.Duration) ([]*woodpecker.Pipeline, error) { + return shared_utils.Paginate(func(page int) ([]*woodpecker.Pipeline, error) { + return client.PipelineList(repoID, + woodpecker.PipelineListOptions{ + ListOptions: woodpecker.ListOptions{ + Page: page, + }, + After: time.Now().Add(-duration), + }, + ) + }, -1) +} diff --git a/cli/pipeline/purge_test.go b/cli/pipeline/purge_test.go new file mode 100644 index 000000000..be185277b --- /dev/null +++ b/cli/pipeline/purge_test.go @@ -0,0 +1,105 @@ +package pipeline + +import ( + "context" + "errors" + "io" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/urfave/cli/v3" + + "go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" + "go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker/mocks" +) + +func TestPipelinePurge(t *testing.T) { + tests := []struct { + name string + repoID int64 + args []string + pipelinesKeep []*woodpecker.Pipeline + pipelines []*woodpecker.Pipeline + wantDelete int + wantErr error + }{ + { + name: "success with no pipelines to purge", + repoID: 1, + args: []string{"purge", "--older-than", "1h", "repo/name"}, + pipelinesKeep: []*woodpecker.Pipeline{ + {ID: 1}, + }, + pipelines: []*woodpecker.Pipeline{}, + }, + { + name: "success with pipelines to purge", + repoID: 1, + args: []string{"purge", "--older-than", "1h", "repo/name"}, + pipelinesKeep: []*woodpecker.Pipeline{ + {ID: 1}, + }, + pipelines: []*woodpecker.Pipeline{ + {ID: 1}, + {ID: 2}, + {ID: 3}, + }, + wantDelete: 2, + }, + { + name: "error on invalid duration", + repoID: 1, + args: []string{"purge", "--older-than", "invalid", "repo/name"}, + wantErr: errors.New("time: invalid duration \"invalid\""), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockClient := mocks.NewClient(t) + mockClient.On("RepoLookup", mock.Anything).Maybe().Return(&woodpecker.Repo{ID: tt.repoID}, nil) + + mockClient.On("PipelineList", mock.Anything, mock.Anything).Return(func(_ int64, opt woodpecker.PipelineListOptions) ([]*woodpecker.Pipeline, error) { + // Return keep pipelines for first call + if opt.After.IsZero() { + if opt.Page == 1 { + return tt.pipelinesKeep, nil + } + return []*woodpecker.Pipeline{}, nil + } + + // Return pipelines to purge for calls with After filter + if !opt.After.IsZero() { + if opt.Page == 1 { + return tt.pipelines, nil + } + return []*woodpecker.Pipeline{}, nil + } + + return []*woodpecker.Pipeline{}, nil + }).Maybe() + + if tt.wantDelete > 0 { + mockClient.On("PipelineDelete", tt.repoID, mock.Anything).Return(nil).Times(tt.wantDelete) + } + + command := pipelinePurgeCmd + command.Writer = io.Discard + command.Action = func(_ context.Context, c *cli.Command) error { + err := pipelinePurge(c, mockClient) + + if tt.wantErr != nil { + assert.EqualError(t, err, tt.wantErr.Error()) + return nil + } + + assert.NoError(t, err) + + return nil + } + + _ = command.Run(context.Background(), tt.args) + }) + } +} diff --git a/cli/pipeline/info.go b/cli/pipeline/show.go similarity index 86% rename from cli/pipeline/info.go rename to cli/pipeline/show.go index 27d05a244..2f14224af 100644 --- a/cli/pipeline/info.go +++ b/cli/pipeline/show.go @@ -25,15 +25,15 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker" ) -var pipelineInfoCmd = &cli.Command{ - Name: "info", - Usage: "show pipeline details", +var pipelineShowCmd = &cli.Command{ + Name: "show", + Usage: "show pipeline information", ArgsUsage: " [pipeline]", - Action: pipelineInfo, + Action: pipelineShow, Flags: common.OutputFlags("table"), } -func pipelineInfo(ctx context.Context, c *cli.Command) error { +func pipelineShow(ctx context.Context, c *cli.Command) error { repoIDOrFullName := c.Args().First() client, err := internal.NewClient(ctx, c) if err != nil { @@ -65,5 +65,5 @@ func pipelineInfo(ctx context.Context, c *cli.Command) error { return err } - return pipelineOutput(c, []woodpecker.Pipeline{*pipeline}) + return pipelineOutput(c, []*woodpecker.Pipeline{pipeline}) } diff --git a/cli/pipeline/start.go b/cli/pipeline/start.go index 4a9b380a2..02c3e3de0 100644 --- a/cli/pipeline/start.go +++ b/cli/pipeline/start.go @@ -35,7 +35,7 @@ var pipelineStartCmd = &cli.Command{ &cli.StringSliceFlag{ Name: "param", Aliases: []string{"p"}, - Usage: "custom parameters to be injected into the step environment. Format: KEY=value", + Usage: "custom parameters to inject into the step environment. Format: KEY=value", }, }, } diff --git a/cli/repo/cron/cron.go b/cli/repo/cron/cron.go index efcfa2c17..90edf8f9c 100644 --- a/cli/repo/cron/cron.go +++ b/cli/repo/cron/cron.go @@ -25,8 +25,8 @@ var Command = &cli.Command{ Commands: []*cli.Command{ cronCreateCmd, cronDeleteCmd, - cronUpdateCmd, - cronInfoCmd, cronListCmd, + cronShowCmd, + cronUpdateCmd, }, } diff --git a/cli/repo/cron/cron_info.go b/cli/repo/cron/cron_show.go similarity index 89% rename from cli/repo/cron/cron_info.go rename to cli/repo/cron/cron_show.go index 276ed15a9..2e8b86650 100644 --- a/cli/repo/cron/cron_info.go +++ b/cli/repo/cron/cron_show.go @@ -25,11 +25,11 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/internal" ) -var cronInfoCmd = &cli.Command{ - Name: "info", - Usage: "display info about a cron job", +var cronShowCmd = &cli.Command{ + Name: "show", + Usage: "show cron job information", ArgsUsage: "[repo-id|repo-full-name]", - Action: cronInfo, + Action: cronShow, Flags: []cli.Flag{ common.RepoFlag, &cli.StringFlag{ @@ -41,7 +41,7 @@ var cronInfoCmd = &cli.Command{ }, } -func cronInfo(ctx context.Context, c *cli.Command) error { +func cronShow(ctx context.Context, c *cli.Command) error { var ( cronID = c.Int("id") repoIDOrFullName = c.String("repository") diff --git a/cli/repo/registry/registry.go b/cli/repo/registry/registry.go index df3f09446..ab362934a 100644 --- a/cli/repo/registry/registry.go +++ b/cli/repo/registry/registry.go @@ -28,9 +28,9 @@ var Command = &cli.Command{ Commands: []*cli.Command{ registryCreateCmd, registryDeleteCmd, - registryUpdateCmd, - registryInfoCmd, registryListCmd, + registryShowCmd, + registryUpdateCmd, }, } diff --git a/cli/repo/registry/registry_add.go b/cli/repo/registry/registry_add.go index e894a698c..50eecffa0 100644 --- a/cli/repo/registry/registry_add.go +++ b/cli/repo/registry/registry_add.go @@ -28,7 +28,7 @@ import ( var registryCreateCmd = &cli.Command{ Name: "add", - Usage: "adds a registry", + Usage: "add a registry", ArgsUsage: "[repo-id|repo-full-name]", Action: registryCreate, Flags: []cli.Flag{ diff --git a/cli/repo/registry/registry_info.go b/cli/repo/registry/registry_show.go similarity index 88% rename from cli/repo/registry/registry_info.go rename to cli/repo/registry/registry_show.go index f171d1d23..d3b50b9f2 100644 --- a/cli/repo/registry/registry_info.go +++ b/cli/repo/registry/registry_show.go @@ -25,11 +25,11 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/internal" ) -var registryInfoCmd = &cli.Command{ - Name: "info", - Usage: "display registry info", +var registryShowCmd = &cli.Command{ + Name: "show", + Usage: "show registry information", ArgsUsage: "[repo-id|repo-full-name]", - Action: registryInfo, + Action: registryShow, Flags: []cli.Flag{ common.RepoFlag, &cli.StringFlag{ @@ -41,7 +41,7 @@ var registryInfoCmd = &cli.Command{ }, } -func registryInfo(ctx context.Context, c *cli.Command) error { +func registryShow(ctx context.Context, c *cli.Command) error { var ( hostname = c.String("hostname") format = c.String("format") + "\n" diff --git a/cli/repo/repo.go b/cli/repo/repo.go index 6eeda1ddd..8bb3b612a 100644 --- a/cli/repo/repo.go +++ b/cli/repo/repo.go @@ -27,16 +27,16 @@ var Command = &cli.Command{ Name: "repo", Usage: "manage repositories", Commands: []*cli.Command{ - repoListCmd, - repoInfoCmd, repoAddCmd, - repoUpdateCmd, + repoChownCmd, + cron.Command, + repoListCmd, + registry.Command, repoRemoveCmd, repoRepairCmd, - repoChownCmd, - repoSyncCmd, - registry.Command, secret.Command, - cron.Command, + repoShowCmd, + repoSyncCmd, + repoUpdateCmd, }, } diff --git a/cli/repo/repo_info.go b/cli/repo/repo_show.go similarity index 90% rename from cli/repo/repo_info.go rename to cli/repo/repo_show.go index 648766940..af8a45153 100644 --- a/cli/repo/repo_info.go +++ b/cli/repo/repo_show.go @@ -25,15 +25,15 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/internal" ) -var repoInfoCmd = &cli.Command{ - Name: "info", - Usage: "show repository details", +var repoShowCmd = &cli.Command{ + Name: "show", + Usage: "show repository information", ArgsUsage: "", - Action: repoInfo, + Action: repoShow, Flags: []cli.Flag{common.FormatFlag(tmplRepoInfo)}, } -func repoInfo(ctx context.Context, c *cli.Command) error { +func repoShow(ctx context.Context, c *cli.Command) error { repoIDOrFullName := c.Args().First() client, err := internal.NewClient(ctx, c) if err != nil { diff --git a/cli/repo/repo_update.go b/cli/repo/repo_update.go index c5fe2a232..b6a2e5846 100644 --- a/cli/repo/repo_update.go +++ b/cli/repo/repo_update.go @@ -53,7 +53,7 @@ var repoUpdateCmd = &cli.Command{ }, &cli.StringFlag{ Name: "config", - Usage: "repository configuration path (e.g. .woodpecker.yml)", + Usage: "repository configuration path. Example: .woodpecker.yml", }, &cli.IntFlag{ Name: "pipeline-counter", @@ -61,7 +61,7 @@ var repoUpdateCmd = &cli.Command{ }, &cli.BoolFlag{ Name: "unsafe", - Usage: "validate updating the pipeline-counter is unsafe", + Usage: "allow unsafe operations", }, }, } diff --git a/cli/repo/secret/secret.go b/cli/repo/secret/secret.go index 1ea67ea99..2d5d965e6 100644 --- a/cli/repo/secret/secret.go +++ b/cli/repo/secret/secret.go @@ -28,9 +28,9 @@ var Command = &cli.Command{ Commands: []*cli.Command{ secretCreateCmd, secretDeleteCmd, - secretUpdateCmd, - secretInfoCmd, secretListCmd, + secretShowCmd, + secretUpdateCmd, }, } diff --git a/cli/repo/secret/secret_add.go b/cli/repo/secret/secret_add.go index ee883c064..cc4251e20 100644 --- a/cli/repo/secret/secret_add.go +++ b/cli/repo/secret/secret_add.go @@ -28,7 +28,7 @@ import ( var secretCreateCmd = &cli.Command{ Name: "add", - Usage: "adds a secret", + Usage: "add a secret", ArgsUsage: "[repo-id|repo-full-name]", Action: secretCreate, Flags: []cli.Flag{ @@ -43,11 +43,11 @@ var secretCreateCmd = &cli.Command{ }, &cli.StringSliceFlag{ Name: "event", - Usage: "secret limited to these events", + Usage: "limit secret to these events", }, &cli.StringSliceFlag{ Name: "image", - Usage: "secret limited to these images", + Usage: "limit secret to these images", }, }, } diff --git a/cli/repo/secret/secret_set.go b/cli/repo/secret/secret_set.go index 0b21d4b66..60c0fcc8d 100644 --- a/cli/repo/secret/secret_set.go +++ b/cli/repo/secret/secret_set.go @@ -43,11 +43,11 @@ var secretUpdateCmd = &cli.Command{ }, &cli.StringSliceFlag{ Name: "event", - Usage: "secret limited to these events", + Usage: "limit secret to these events", }, &cli.StringSliceFlag{ Name: "image", - Usage: "secret limited to these images", + Usage: "limit secret to these images", }, }, } diff --git a/cli/repo/secret/secret_info.go b/cli/repo/secret/secret_show.go similarity index 89% rename from cli/repo/secret/secret_info.go rename to cli/repo/secret/secret_show.go index fcb30db83..8387f4054 100644 --- a/cli/repo/secret/secret_info.go +++ b/cli/repo/secret/secret_show.go @@ -26,11 +26,11 @@ import ( "go.woodpecker-ci.org/woodpecker/v2/cli/internal" ) -var secretInfoCmd = &cli.Command{ - Name: "info", - Usage: "display secret info", +var secretShowCmd = &cli.Command{ + Name: "show", + Usage: "show secret information", ArgsUsage: "[repo-id|repo-full-name]", - Action: secretInfo, + Action: secretShow, Flags: []cli.Flag{ common.RepoFlag, &cli.StringFlag{ @@ -41,7 +41,7 @@ var secretInfoCmd = &cli.Command{ }, } -func secretInfo(ctx context.Context, c *cli.Command) error { +func secretShow(ctx context.Context, c *cli.Command) error { var ( secretName = c.String("name") format = c.String("format") + "\n" diff --git a/cli/setup/setup.go b/cli/setup/setup.go index 6705482e9..c0be0006a 100644 --- a/cli/setup/setup.go +++ b/cli/setup/setup.go @@ -20,11 +20,11 @@ var Command = &cli.Command{ Flags: []cli.Flag{ &cli.StringFlag{ Name: "server", - Usage: "The URL of the woodpecker server", + Usage: "URL of the woodpecker server", }, &cli.StringFlag{ Name: "token", - Usage: "The token to authenticate with the woodpecker server", + Usage: "token to authenticate with the woodpecker server", }, }, Action: setup, @@ -41,7 +41,7 @@ func setup(ctx context.Context, c *cli.Command) error { } if !setupAgain { - log.Info().Msg("Configuration skipped") + log.Info().Msg("configuration skipped") return nil } } @@ -87,7 +87,7 @@ func setup(ctx context.Context, c *cli.Command) error { return err } - log.Info().Msg("The woodpecker-cli has been successfully setup") + log.Info().Msg("woodpecker-cli has been successfully setup") return nil } diff --git a/cli/setup/token_fetcher.go b/cli/setup/token_fetcher.go index 59be6b08d..05305e7ca 100644 --- a/cli/setup/token_fetcher.go +++ b/cli/setup/token_fetcher.go @@ -24,12 +24,12 @@ func receiveTokenFromUI(c context.Context, serverURL string) (string, error) { srv.Handler = setupRouter(tokenReceived) go func() { - log.Debug().Msgf("Listening for token response on :%d", port) + log.Debug().Msgf("listening for token response on :%d", port) _ = srv.ListenAndServe() }() defer func() { - log.Debug().Msg("Shutting down server") + log.Debug().Msg("shutting down server") _ = srv.Shutdown(c) }() @@ -90,7 +90,7 @@ func setupRouter(tokenReceived chan string) *gin.Engine { err := c.BindJSON(&data) if err != nil { - log.Debug().Err(err).Msg("Failed to bind JSON") + log.Debug().Err(err).Msg("failed to bind JSON") c.JSON(http.StatusBadRequest, gin.H{ "error": "invalid request", }) @@ -110,7 +110,7 @@ func setupRouter(tokenReceived chan string) *gin.Engine { func openBrowser(url string) error { var err error - log.Debug().Msgf("Opening browser with URL: %s", url) + log.Debug().Msgf("opening browser with URL: %s", url) switch runtime.GOOS { case "linux": diff --git a/cli/update/command.go b/cli/update/command.go index ad856402f..a4dad8530 100644 --- a/cli/update/command.go +++ b/cli/update/command.go @@ -24,7 +24,7 @@ var Command = &cli.Command{ } func update(ctx context.Context, c *cli.Command) error { - log.Info().Msg("Checking for updates ...") + log.Info().Msg("checking for updates ...") newVersion, err := CheckForUpdate(ctx, c.Bool("force")) if err != nil { @@ -32,11 +32,11 @@ func update(ctx context.Context, c *cli.Command) error { } if newVersion == nil { - fmt.Println("You are using the latest version of woodpecker-cli") + fmt.Println("you are using the latest version of woodpecker-cli") return nil } - log.Info().Msgf("New version %s is available! Updating ...", newVersion.Version) + log.Info().Msgf("new version %s is available! Updating ...", newVersion.Version) var tarFilePath string tarFilePath, err = downloadNewVersion(ctx, newVersion.AssetURL) @@ -44,14 +44,14 @@ func update(ctx context.Context, c *cli.Command) error { return err } - log.Debug().Msgf("New version %s has been downloaded successfully! Installing ...", newVersion.Version) + log.Debug().Msgf("new version %s has been downloaded successfully! Installing ...", newVersion.Version) binFile, err := extractNewVersion(tarFilePath) if err != nil { return err } - log.Debug().Msgf("New version %s has been extracted to %s", newVersion.Version, binFile) + log.Debug().Msgf("new version %s has been extracted to %s", newVersion.Version, binFile) executablePathOrSymlink, err := os.Executable() if err != nil { diff --git a/cli/update/updater.go b/cli/update/updater.go index 9071e2605..d77bad6a4 100644 --- a/cli/update/updater.go +++ b/cli/update/updater.go @@ -22,10 +22,10 @@ func CheckForUpdate(ctx context.Context, force bool) (*NewVersion, error) { } func checkForUpdate(ctx context.Context, versionURL string, force bool) (*NewVersion, error) { - log.Debug().Msgf("Current version: %s", version.String()) + log.Debug().Msgf("current version: %s", version.String()) if (version.String() == "dev" || strings.HasPrefix(version.String(), "next-")) && !force { - log.Debug().Msgf("Skipping update check for development & next versions") + log.Debug().Msgf("skipping update check for development/next versions") return nil, nil } @@ -61,11 +61,11 @@ func checkForUpdate(ctx context.Context, versionURL string, force bool) (*NewVer // using the latest release if installedVersion == upstreamVersion && !force { - log.Debug().Msgf("No new version available") + log.Debug().Msgf("no new version available") return nil, nil } - log.Debug().Msgf("New version available: %s", upstreamVersion) + log.Debug().Msgf("new version available: %s", upstreamVersion) assetURL := fmt.Sprintf(githubBinaryURL, upstreamVersion, runtime.GOOS, runtime.GOARCH) return &NewVersion{ @@ -75,7 +75,7 @@ func checkForUpdate(ctx context.Context, versionURL string, force bool) (*NewVer } func downloadNewVersion(ctx context.Context, downloadURL string) (string, error) { - log.Debug().Msgf("Downloading new version from %s ...", downloadURL) + log.Debug().Msgf("downloading new version from %s ...", downloadURL) req, err := http.NewRequestWithContext(ctx, http.MethodGet, downloadURL, nil) if err != nil { @@ -102,13 +102,13 @@ func downloadNewVersion(ctx context.Context, downloadURL string) (string, error) return "", err } - log.Debug().Msgf("New version downloaded to %s", file.Name()) + log.Debug().Msgf("new version downloaded to %s", file.Name()) return file.Name(), nil } func extractNewVersion(tarFilePath string) (string, error) { - log.Debug().Msgf("Extracting new version from %s ...", tarFilePath) + log.Debug().Msgf("extracting new version from %s ...", tarFilePath) tarFile, err := os.Open(tarFilePath) if err != nil { @@ -132,7 +132,7 @@ func extractNewVersion(tarFilePath string) (string, error) { return "", err } - log.Debug().Msgf("New version extracted to %s", tmpDir) + log.Debug().Msgf("new version extracted to %s", tmpDir) return path.Join(tmpDir, "woodpecker-cli"), nil } diff --git a/cmd/cli/app.go b/cmd/cli/app.go index 347513b1c..2784b08a3 100644 --- a/cmd/cli/app.go +++ b/cmd/cli/app.go @@ -43,12 +43,12 @@ func newApp() *cli.Command { app.Suggest = true app.Commands = []*cli.Command{ admin.Command, - org.Command, - repo.Command, - pipeline.Command, exec.Command, info.Command, lint.Command, + org.Command, + pipeline.Command, + repo.Command, setup.Command, update.Command, } diff --git a/cmd/server/openapi/docs.go b/cmd/server/openapi/docs.go index 59e148fc4..8b7c33c60 100644 --- a/cmd/server/openapi/docs.go +++ b/cmd/server/openapi/docs.go @@ -2984,6 +2984,12 @@ const docTemplate = `{ "description": "filter pipelines by strings contained in ref", "name": "ref", "in": "query" + }, + { + "type": "string", + "description": "filter pipelines by status", + "name": "status", + "in": "query" } ], "responses": { diff --git a/docs/docs/20-usage/50-environment.md b/docs/docs/20-usage/50-environment.md index 9f6bd75e7..2e056ecc6 100644 --- a/docs/docs/20-usage/50-environment.md +++ b/docs/docs/20-usage/50-environment.md @@ -70,11 +70,11 @@ This is the reference list of all environment variables available to your pipeli | `CI_COMMIT_REF` | commit ref | `refs/heads/main` | | `CI_COMMIT_REFSPEC` | commit ref spec | `issue-branch:main` | | `CI_COMMIT_BRANCH` | commit branch (equals target branch for pull requests) | `main` | -| `CI_COMMIT_SOURCE_BRANCH` | commit source branch (empty if event is not `pull_request` or `pull_request_closed`) | `issue-branch` | -| `CI_COMMIT_TARGET_BRANCH` | commit target branch (empty if event is not `pull_request` or `pull_request_closed`) | `main` | +| `CI_COMMIT_SOURCE_BRANCH` | commit source branch (set only for `pull_request` and `pull_request_closed` events) | `issue-branch` | +| `CI_COMMIT_TARGET_BRANCH` | commit target branch (set only for `pull_request` and `pull_request_closed` events) | `main` | | `CI_COMMIT_TAG` | commit tag name (empty if event is not `tag`) | `v1.10.3` | -| `CI_COMMIT_PULL_REQUEST` | commit pull request number (empty if event is not `pull_request` or `pull_request_closed`) | `1` | -| `CI_COMMIT_PULL_REQUEST_LABELS` | labels assigned to pull request (empty if event is not `pull_request` or `pull_request_closed`) | `server` | +| `CI_COMMIT_PULL_REQUEST` | commit pull request number (set only for `pull_request` and `pull_request_closed` events) | `1` | +| `CI_COMMIT_PULL_REQUEST_LABELS` | labels assigned to pull request (set only for `pull_request` and `pull_request_closed` events) | `server` | | `CI_COMMIT_MESSAGE` | commit message | `Initial commit` | | `CI_COMMIT_AUTHOR` | commit author username | `john-doe` | | `CI_COMMIT_AUTHOR_EMAIL` | commit author email address | `john-doe@example.com` | @@ -103,8 +103,8 @@ This is the reference list of all environment variables available to your pipeli | `CI_PREV_COMMIT_REF` | previous commit ref | `refs/heads/main` | | `CI_PREV_COMMIT_REFSPEC` | previous commit ref spec | `issue-branch:main` | | `CI_PREV_COMMIT_BRANCH` | previous commit branch | `main` | -| `CI_PREV_COMMIT_SOURCE_BRANCH` | previous commit source branch | `issue-branch` | -| `CI_PREV_COMMIT_TARGET_BRANCH` | previous commit target branch | `main` | +| `CI_PREV_COMMIT_SOURCE_BRANCH` | previous commit source branch (set only for `pull_request` and `pull_request_closed` events) | `issue-branch` | +| `CI_PREV_COMMIT_TARGET_BRANCH` | previous commit target branch (set only for `pull_request` and `pull_request_closed` events) | `main` | | `CI_PREV_COMMIT_URL` | previous commit link in forge | `https://git.example.com/john-doe/my-repo/commit/15784117e4e103f36cba75a9e29da48046eb82c4` | | `CI_PREV_COMMIT_MESSAGE` | previous commit message | `test` | | `CI_PREV_COMMIT_AUTHOR` | previous commit author username | `john-doe` | diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index e403a7234..05253ec9f 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -119,7 +119,7 @@ importers: version: 9.1.0 isomorphic-dompurify: specifier: ^2.16.0 - version: 2.17.0 + version: 2.18.0 marked: specifier: ^15.0.2 version: 15.0.3 @@ -2753,8 +2753,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.2.1: - resolution: {integrity: sha512-NBHEsc0/kzRYQd+AY6HR6B/IgsqzBABrqJbpCDQII/OK6h7B7LXzweZTDsqSW2LkTRpoxf18YUP+YjGySk6B3w==} + dompurify@3.2.2: + resolution: {integrity: sha512-YMM+erhdZ2nkZ4fTNRTSI94mb7VG7uVF5vj5Zde7tImgnhZE3R6YW/IACGIHb2ux+QkEXMhe591N+5jWOmL4Zw==} domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -2778,8 +2778,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.64: - resolution: {integrity: sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==} + electron-to-chromium@1.5.67: + resolution: {integrity: sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2857,8 +2857,8 @@ packages: es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} es6-promise@3.3.1: @@ -3230,8 +3230,9 @@ packages: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.1.0: + resolution: {integrity: sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==} + engines: {node: '>= 0.4'} got@14.4.5: resolution: {integrity: sha512-sq+uET8TnNKRNnjEOPJzMcxeI0irT8BBNmf+GtZcJpmhYsQM1DSKmCROUjPWKsXZ5HzwD5Cf5/RV+QD9BSTxJg==} @@ -3264,8 +3265,8 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + has-proto@1.1.0: + resolution: {integrity: sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==} engines: {node: '>= 0.4'} has-symbols@1.0.3: @@ -3615,8 +3616,8 @@ packages: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + is-number-object@1.1.0: + resolution: {integrity: sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -3654,8 +3655,8 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.0: + resolution: {integrity: sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==} engines: {node: '>= 0.4'} is-regexp@1.0.0: @@ -3732,8 +3733,8 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - isomorphic-dompurify@2.17.0: - resolution: {integrity: sha512-W9RC9aPgEAFF55VMo/9AUQ+GYkQ68gTRMLqS8fP9rw1VoYCsI7RdrRMAePhhqyCLfZS3JNjA4ahFi1L4aczUUg==} + isomorphic-dompurify@2.18.0: + resolution: {integrity: sha512-e0AaROtWPy6ofSTCnUuBvXFidt1eFmrwEbi+Acpz0du6v2H+fq+3svPBn0g/AfBXz24FTWA9ccle7HSFT3HG7A==} engines: {node: '>=18'} jest-util@29.7.0: @@ -4241,8 +4242,8 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -4319,8 +4320,8 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 - nwsapi@2.2.13: - resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} oas-kit-common@1.0.8: resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} @@ -4388,8 +4389,8 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openapi-sampler@1.6.0: - resolution: {integrity: sha512-0PKhql1Ms38xSngEztcNQ7EXgssR2jAyVX7RckEln4reynIr/HHwuwM29cDEpiNkk4OkrHoc+7Li9V7WTAPYmw==} + openapi-sampler@1.6.1: + resolution: {integrity: sha512-s1cIatOqrrhSj2tmJ4abFYZQK6l5v+V4toO5q1Pa0DyN8mtyqy2I+Qrj5W9vOELEtybIMQs/TBZGVO/DtTFK8w==} opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} @@ -5191,8 +5192,8 @@ packages: resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} - registry-auth-token@5.0.2: - resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + registry-auth-token@5.0.3: + resolution: {integrity: sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==} engines: {node: '>=14'} registry-url@6.0.1: @@ -5433,8 +5434,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} @@ -5702,11 +5704,11 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - tldts-core@6.1.64: - resolution: {integrity: sha512-uqnl8vGV16KsyflHOzqrYjjArjfXaU6rMPXYy2/ZWoRKCkXtghgB4VwTDXUG+t0OTGeSewNAG31/x1gCTfLt+Q==} + tldts-core@6.1.65: + resolution: {integrity: sha512-Uq5t0N0Oj4nQSbU8wFN1YYENvMthvwU13MQrMJRspYCGLSAZjAfoBOJki5IQpnBM/WFskxxC/gIOTwaedmHaSg==} - tldts@6.1.64: - resolution: {integrity: sha512-ph4AE5BXWIOsSy9stpoeo7bYe/Cy7VfpciIH4RhVZUPItCJmhqWCN0EVzxd8BOHiyNb42vuJc6NWTjJkg91Tuw==} + tldts@6.1.65: + resolution: {integrity: sha512-xU9gLTfAGsADQ2PcWee6Hg8RFAv0DnjMGVJmDnUmI8a9+nYmapMQix4afwrdaCtT+AqP4MaxEzu7cCrYmBPbzQ==} hasBin: true to-regex-range@5.0.1: @@ -5760,8 +5762,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.28.0: - resolution: {integrity: sha512-jXMwges/FVbFRe5lTMJZVEZCrO9kI9c8k0PA/z7nF3bo0JSCCLysvokFjNPIUK/itEMas10MQM+AiHoHt/T/XA==} + type-fest@4.29.1: + resolution: {integrity: sha512-Y1zUveI92UYM/vo1EFlQSsNf74+hfKH+7saZJslF0Fw92FRaiTAnHPIvo9d7SLxXt/gAYqA4RXyDTioMQCCp0A==} engines: {node: '>=16'} type-is@1.6.18: @@ -6033,8 +6035,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.16: + resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} engines: {node: '>= 0.4'} which@1.3.1: @@ -9162,7 +9164,7 @@ snapshots: browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001684 - electron-to-chromium: 1.5.64 + electron-to-chromium: 1.5.67 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) @@ -9375,7 +9377,7 @@ snapshots: chalk: 4.1.2 lodash: 4.17.21 rxjs: 7.8.1 - shell-quote: 1.8.1 + shell-quote: 1.8.2 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -9669,7 +9671,7 @@ snapshots: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.1.0 define-lazy-prop@2.0.0: {} @@ -9793,7 +9795,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.2.1: + dompurify@3.2.2: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -9824,7 +9826,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.64: {} + electron-to-chromium@1.5.67: {} emoji-regex@8.0.0: {} @@ -9869,8 +9871,8 @@ snapshots: html-element-map: 1.3.1 is-boolean-object: 1.1.2 is-callable: 1.2.7 - is-number-object: 1.0.7 - is-regex: 1.1.4 + is-number-object: 1.1.0 + is-regex: 1.2.0 is-string: 1.0.7 is-subset: 0.1.1 lodash.escape: 4.0.1 @@ -9901,14 +9903,14 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 + es-to-primitive: 1.3.0 function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.1.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 + has-proto: 1.1.0 has-symbols: 1.0.3 hasown: 2.0.2 internal-slot: 1.0.7 @@ -9916,7 +9918,7 @@ snapshots: is-callable: 1.2.7 is-data-view: 1.0.1 is-negative-zero: 2.0.3 - is-regex: 1.1.4 + is-regex: 1.2.0 is-shared-array-buffer: 1.0.3 is-string: 1.0.7 is-typed-array: 1.1.13 @@ -9935,7 +9937,7 @@ snapshots: typed-array-byte-offset: 1.0.3 typed-array-length: 1.0.7 unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.16 es-array-method-boxes-properly@1.0.0: {} @@ -9961,7 +9963,7 @@ snapshots: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 @@ -10328,7 +10330,7 @@ snapshots: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.3 + has-proto: 1.1.0 has-symbols: 1.0.3 hasown: 2.0.2 @@ -10391,7 +10393,7 @@ snapshots: globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.1.0 globby@11.1.0: dependencies: @@ -10410,7 +10412,7 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 - gopd@1.0.1: + gopd@1.1.0: dependencies: get-intrinsic: 1.2.4 @@ -10426,7 +10428,7 @@ snapshots: lowercase-keys: 3.0.0 p-cancelable: 4.0.1 responselike: 3.0.0 - type-fest: 4.28.0 + type-fest: 4.29.1 graceful-fs@4.2.10: {} @@ -10453,7 +10455,9 @@ snapshots: dependencies: es-define-property: 1.0.0 - has-proto@1.0.3: {} + has-proto@1.1.0: + dependencies: + call-bind: 1.0.7 has-symbols@1.0.3: {} @@ -10869,8 +10873,9 @@ snapshots: is-npm@6.0.0: {} - is-number-object@1.0.7: + is-number-object@1.1.0: dependencies: + call-bind: 1.0.7 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -10893,10 +10898,12 @@ snapshots: is-potential-custom-element-name@1.0.1: {} - is-regex@1.1.4: + is-regex@1.2.0: dependencies: call-bind: 1.0.7 + gopd: 1.1.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 is-regexp@1.0.0: {} @@ -10924,7 +10931,7 @@ snapshots: is-typed-array@1.1.13: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.16 is-typedarray@1.0.0: {} @@ -10953,9 +10960,9 @@ snapshots: isobject@3.0.1: {} - isomorphic-dompurify@2.17.0: + isomorphic-dompurify@2.18.0: dependencies: - dompurify: 3.2.1 + dompurify: 3.2.2 jsdom: 25.0.1 transitivePeerDependencies: - bufferutil @@ -11018,7 +11025,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.13 + nwsapi: 2.2.16 parse5: 7.2.1 rrweb-cssom: 0.7.1 saxes: 6.0.0 @@ -11077,7 +11084,7 @@ snapshots: launch-editor@2.9.1: dependencies: picocolors: 1.1.1 - shell-quote: 1.8.1 + shell-quote: 1.8.2 leven@3.1.0: {} @@ -11734,7 +11741,7 @@ snapshots: dns-packet: 5.6.1 thunky: 1.1.0 - nanoid@3.3.7: {} + nanoid@3.3.8: {} nearley@2.20.1: dependencies: @@ -11799,7 +11806,7 @@ snapshots: schema-utils: 3.3.0 webpack: 5.96.1 - nwsapi@2.2.13: {} + nwsapi@2.2.16: {} oas-kit-common@1.0.8: dependencies: @@ -11884,7 +11891,7 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openapi-sampler@1.6.0: + openapi-sampler@1.6.1: dependencies: '@types/json-schema': 7.0.15 fast-xml-parser: 4.5.0 @@ -11932,7 +11939,7 @@ snapshots: package-json@8.1.1: dependencies: got: 14.4.5 - registry-auth-token: 5.0.2 + registry-auth-token: 5.0.3 registry-url: 6.0.1 semver: 7.6.3 @@ -12462,13 +12469,13 @@ snapshots: postcss@8.4.38: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.49: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -12585,7 +12592,7 @@ snapshots: prompts: 2.4.2 react-error-overlay: 6.0.11 recursive-readdir: 2.2.3 - shell-quote: 1.8.1 + shell-quote: 1.8.2 strip-ansi: 6.0.1 text-table: 0.2.0 webpack: 5.96.1 @@ -12750,7 +12757,7 @@ snapshots: classnames: 2.5.1 core-js: 3.39.0 decko: 1.2.0 - dompurify: 3.2.1 + dompurify: 3.2.2 eventemitter3: 5.0.1 json-pointer: 0.6.2 lunr: 2.3.9 @@ -12758,7 +12765,7 @@ snapshots: marked: 4.3.0 mobx: 6.13.5 mobx-react: 9.1.1(mobx@6.13.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - openapi-sampler: 1.6.0 + openapi-sampler: 1.6.1 path-browserify: 1.0.1 perfect-scrollbar: 1.5.6 polished: 4.3.1 @@ -12803,7 +12810,7 @@ snapshots: es-abstract: 1.23.5 es-errors: 1.3.0 get-intrinsic: 1.2.4 - gopd: 1.0.1 + gopd: 1.1.0 which-builtin-type: 1.2.0 reftools@1.1.9: {} @@ -12836,7 +12843,7 @@ snapshots: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.0 - registry-auth-token@5.0.2: + registry-auth-token@5.0.3: dependencies: '@pnpm/npm-conf': 2.3.1 @@ -13018,7 +13025,7 @@ snapshots: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 - is-regex: 1.1.4 + is-regex: 1.2.0 safer-buffer@2.1.2: {} @@ -13132,7 +13139,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - gopd: 1.0.1 + gopd: 1.1.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -13158,7 +13165,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} + shell-quote@1.8.2: {} shelljs@0.8.5: dependencies: @@ -13453,11 +13460,11 @@ snapshots: tiny-warning@1.0.3: {} - tldts-core@6.1.64: {} + tldts-core@6.1.65: {} - tldts@6.1.64: + tldts@6.1.65: dependencies: - tldts-core: 6.1.64 + tldts-core: 6.1.65 to-regex-range@5.0.1: dependencies: @@ -13469,7 +13476,7 @@ snapshots: tough-cookie@5.0.0: dependencies: - tldts: 6.1.64 + tldts: 6.1.65 tr46@0.0.3: {} @@ -13493,7 +13500,7 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.28.0: {} + type-fest@4.29.1: {} type-is@1.6.18: dependencies: @@ -13510,8 +13517,8 @@ snapshots: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 + gopd: 1.1.0 + has-proto: 1.1.0 is-typed-array: 1.1.13 typed-array-byte-offset@1.0.3: @@ -13519,8 +13526,8 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 + gopd: 1.1.0 + has-proto: 1.1.0 is-typed-array: 1.1.13 reflect.getprototypeof: 1.0.7 @@ -13528,7 +13535,7 @@ snapshots: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.1.0 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.7 @@ -13856,7 +13863,7 @@ snapshots: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 - is-number-object: 1.0.7 + is-number-object: 1.1.0 is-string: 1.0.7 is-symbol: 1.0.4 @@ -13869,12 +13876,12 @@ snapshots: is-date-object: 1.0.5 is-finalizationregistry: 1.1.0 is-generator-function: 1.0.10 - is-regex: 1.1.4 + is-regex: 1.2.0 is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.16 which-collection@1.0.2: dependencies: @@ -13883,12 +13890,12 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.3 - which-typed-array@1.1.15: + which-typed-array@1.1.16: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.1.0 has-tostringtag: 1.0.2 which@1.3.1: diff --git a/docs/src/pages/migrations.md b/docs/src/pages/migrations.md index 3206115b7..e49c92b6c 100644 --- a/docs/src/pages/migrations.md +++ b/docs/src/pages/migrations.md @@ -33,6 +33,7 @@ This will be the next version of Woodpecker. - Removed old API routes: `registry/` -> `registries`, `/authorize/token` - Replaced `registry` command with `repo registry` in cli - Deprecated `secrets`, use `environment` with `from_secret` +- Empty string environment variables are not set - CLI commands got restructured to provide a simplified structure: - `woodpecker-cli secret [add|rm|...] --global` is now `woodpecker-cli admin secret [add|rm|...]` - `woodpecker-cli user` is now `woodpecker-cli admin user` @@ -42,6 +43,8 @@ This will be the next version of Woodpecker. - `woodpecker-cli log` is now `woodpecker-cli pipeline log` - `woodpecker-cli cron` is now `woodpecker-cli repo cron` - `woodpecker-cli secret [add|rm|...] --repository` is now `woodpecker-cli repo secret [add|rm|...]` + - `woodpecker-cli pipeline logs` is now `woodpecker-cli pipeline log show` + - `woodpecker-cli [registry|secret|...] info` is now `woodpecker-cli [registry|secret|...] show` - Deprecated `detached` in favor of services ## Admin migrations diff --git a/go.mod b/go.mod index e71e692a5..5eb7972e7 100644 --- a/go.mod +++ b/go.mod @@ -56,7 +56,7 @@ require ( github.com/swaggo/gin-swagger v1.6.0 github.com/swaggo/swag v1.16.4 github.com/urfave/cli-docs/v3 v3.0.0-alpha6 - github.com/urfave/cli/v3 v3.0.0-alpha9.6 + github.com/urfave/cli/v3 v3.0.0-alpha9.10 github.com/xanzy/go-gitlab v0.114.0 github.com/xeipuuv/gojsonschema v1.2.0 github.com/yaronf/httpsign v0.3.1 diff --git a/go.sum b/go.sum index 9b7c27b46..9095124ff 100644 --- a/go.sum +++ b/go.sum @@ -545,8 +545,8 @@ github.com/urfave/cli-docs/v3 v3.0.0-alpha6 h1:w/l/N0xw1rO/aHRIGXJ0lDwwYFOzilup1 github.com/urfave/cli-docs/v3 v3.0.0-alpha6/go.mod h1:p7Z4lg8FSTrPB9GTaNyTrK3ygffHZcK3w0cU2VE+mzU= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/cli/v3 v3.0.0-alpha9.6 h1:MvGvMfcbnEBNBDkH7melypUZ9Rc1RYnQuLvNRTZFsbs= -github.com/urfave/cli/v3 v3.0.0-alpha9.6/go.mod h1:FnIeEMYu+ko8zP1F9Ypr3xkZMIDqW3DR92yUtY39q1Y= +github.com/urfave/cli/v3 v3.0.0-alpha9.10 h1:whPwidq9cUh18NBqzSR8N3tts8NiQDsTmt9s7AyX85c= +github.com/urfave/cli/v3 v3.0.0-alpha9.10/go.mod h1:FnIeEMYu+ko8zP1F9Ypr3xkZMIDqW3DR92yUtY39q1Y= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xanzy/go-gitlab v0.114.0 h1:0wQr/KBckwrZPfEMjRqpUz0HmsKKON9UhCYv9KDy19M= diff --git a/pipeline/frontend/metadata/environment.go b/pipeline/frontend/metadata/environment.go index 25ac55d31..2d406820e 100644 --- a/pipeline/frontend/metadata/environment.go +++ b/pipeline/frontend/metadata/environment.go @@ -25,11 +25,143 @@ import ( "github.com/rs/zerolog/log" ) -var ( - pullRegexp = regexp.MustCompile(`\d+`) - maxChangedFiles = 500 +const ( + initialEnvMapSize = 100 + maxChangedFiles = 500 ) +var pullRegexp = regexp.MustCompile(`\d+`) + +// Environ returns the metadata as a map of environment variables. +func (m *Metadata) Environ() map[string]string { + params := make(map[string]string, initialEnvMapSize) + + system := m.Sys + setNonEmptyEnvVar(params, "CI", system.Name) + setNonEmptyEnvVar(params, "CI_SYSTEM_NAME", system.Name) + setNonEmptyEnvVar(params, "CI_SYSTEM_URL", system.URL) + setNonEmptyEnvVar(params, "CI_SYSTEM_HOST", system.Host) + setNonEmptyEnvVar(params, "CI_SYSTEM_PLATFORM", system.Platform) // will be set by pipeline platform option or by agent + setNonEmptyEnvVar(params, "CI_SYSTEM_VERSION", system.Version) + + forge := m.Forge + setNonEmptyEnvVar(params, "CI_FORGE_TYPE", forge.Type) + setNonEmptyEnvVar(params, "CI_FORGE_URL", forge.URL) + + repo := m.Repo + setNonEmptyEnvVar(params, "CI_REPO", path.Join(repo.Owner, repo.Name)) + setNonEmptyEnvVar(params, "CI_REPO_NAME", repo.Name) + setNonEmptyEnvVar(params, "CI_REPO_OWNER", repo.Owner) + setNonEmptyEnvVar(params, "CI_REPO_REMOTE_ID", repo.RemoteID) + setNonEmptyEnvVar(params, "CI_REPO_SCM", repo.SCM) + setNonEmptyEnvVar(params, "CI_REPO_URL", repo.ForgeURL) + setNonEmptyEnvVar(params, "CI_REPO_CLONE_URL", repo.CloneURL) + setNonEmptyEnvVar(params, "CI_REPO_CLONE_SSH_URL", repo.CloneSSHURL) + setNonEmptyEnvVar(params, "CI_REPO_DEFAULT_BRANCH", repo.Branch) + setNonEmptyEnvVar(params, "CI_REPO_PRIVATE", strconv.FormatBool(repo.Private)) + setNonEmptyEnvVar(params, "CI_REPO_TRUSTED_NETWORK", strconv.FormatBool(repo.Trusted.Network)) + setNonEmptyEnvVar(params, "CI_REPO_TRUSTED_VOLUMES", strconv.FormatBool(repo.Trusted.Volumes)) + setNonEmptyEnvVar(params, "CI_REPO_TRUSTED_SECURITY", strconv.FormatBool(repo.Trusted.Security)) + // Deprecated remove in 4.x + setNonEmptyEnvVar(params, "CI_REPO_TRUSTED", strconv.FormatBool(m.Repo.Trusted.Security && m.Repo.Trusted.Network && m.Repo.Trusted.Volumes)) + + pipeline := m.Curr + setNonEmptyEnvVar(params, "CI_PIPELINE_NUMBER", strconv.FormatInt(pipeline.Number, 10)) + setNonEmptyEnvVar(params, "CI_PIPELINE_PARENT", strconv.FormatInt(pipeline.Parent, 10)) + setNonEmptyEnvVar(params, "CI_PIPELINE_EVENT", pipeline.Event) + setNonEmptyEnvVar(params, "CI_PIPELINE_URL", m.getPipelineWebURL(pipeline, 0)) + setNonEmptyEnvVar(params, "CI_PIPELINE_FORGE_URL", pipeline.ForgeURL) + setNonEmptyEnvVar(params, "CI_PIPELINE_DEPLOY_TARGET", pipeline.DeployTo) + setNonEmptyEnvVar(params, "CI_PIPELINE_DEPLOY_TASK", pipeline.DeployTask) + setNonEmptyEnvVar(params, "CI_PIPELINE_CREATED", strconv.FormatInt(pipeline.Created, 10)) + setNonEmptyEnvVar(params, "CI_PIPELINE_STARTED", strconv.FormatInt(pipeline.Started, 10)) + + workflow := m.Workflow + setNonEmptyEnvVar(params, "CI_WORKFLOW_NAME", workflow.Name) + setNonEmptyEnvVar(params, "CI_WORKFLOW_NUMBER", strconv.Itoa(workflow.Number)) + + step := m.Step + setNonEmptyEnvVar(params, "CI_STEP_NAME", step.Name) + setNonEmptyEnvVar(params, "CI_STEP_NUMBER", strconv.Itoa(step.Number)) + setNonEmptyEnvVar(params, "CI_STEP_URL", m.getPipelineWebURL(pipeline, step.Number)) + // CI_STEP_STARTED will be set by agent + + commit := pipeline.Commit + setNonEmptyEnvVar(params, "CI_COMMIT_SHA", commit.Sha) + setNonEmptyEnvVar(params, "CI_COMMIT_REF", commit.Ref) + setNonEmptyEnvVar(params, "CI_COMMIT_REFSPEC", commit.Refspec) + setNonEmptyEnvVar(params, "CI_COMMIT_MESSAGE", commit.Message) + setNonEmptyEnvVar(params, "CI_COMMIT_BRANCH", commit.Branch) + setNonEmptyEnvVar(params, "CI_COMMIT_AUTHOR", commit.Author.Name) + setNonEmptyEnvVar(params, "CI_COMMIT_AUTHOR_EMAIL", commit.Author.Email) + setNonEmptyEnvVar(params, "CI_COMMIT_AUTHOR_AVATAR", commit.Author.Avatar) + if pipeline.Event == EventTag || pipeline.Event == EventRelease || strings.HasPrefix(pipeline.Commit.Ref, "refs/tags/") { + setNonEmptyEnvVar(params, "CI_COMMIT_TAG", strings.TrimPrefix(pipeline.Commit.Ref, "refs/tags/")) + } + if pipeline.Event == EventRelease { + setNonEmptyEnvVar(params, "CI_COMMIT_PRERELEASE", strconv.FormatBool(pipeline.Commit.IsPrerelease)) + } + if pipeline.Event == EventPull || pipeline.Event == EventPullClosed { + sourceBranch, targetBranch := getSourceTargetBranches(commit.Refspec) + setNonEmptyEnvVar(params, "CI_COMMIT_SOURCE_BRANCH", sourceBranch) + setNonEmptyEnvVar(params, "CI_COMMIT_TARGET_BRANCH", targetBranch) + setNonEmptyEnvVar(params, "CI_COMMIT_PULL_REQUEST", pullRegexp.FindString(pipeline.Commit.Ref)) + setNonEmptyEnvVar(params, "CI_COMMIT_PULL_REQUEST_LABELS", strings.Join(pipeline.Commit.PullRequestLabels, ",")) + } + + // Only export changed files if maxChangedFiles is not exceeded + changedFiles := commit.ChangedFiles + if len(changedFiles) == 0 { + params["CI_PIPELINE_FILES"] = "[]" + } else if len(changedFiles) <= maxChangedFiles { + // we have to use json, as other separators like ;, or space are valid filename chars + changedFiles, err := json.Marshal(changedFiles) + if err != nil { + log.Error().Err(err).Msg("marshal changed files") + } + params["CI_PIPELINE_FILES"] = string(changedFiles) + } + + prevPipeline := m.Prev + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_NUMBER", strconv.FormatInt(prevPipeline.Number, 10)) + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_PARENT", strconv.FormatInt(prevPipeline.Parent, 10)) + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_EVENT", prevPipeline.Event) + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_URL", m.getPipelineWebURL(prevPipeline, 0)) + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_FORGE_URL", prevPipeline.ForgeURL) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_URL", prevPipeline.ForgeURL) // why commit url? + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_DEPLOY_TARGET", prevPipeline.DeployTo) + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_DEPLOY_TASK", prevPipeline.DeployTask) + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_STATUS", prevPipeline.Status) + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_CREATED", strconv.FormatInt(prevPipeline.Created, 10)) + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_STARTED", strconv.FormatInt(prevPipeline.Started, 10)) + setNonEmptyEnvVar(params, "CI_PREV_PIPELINE_FINISHED", strconv.FormatInt(prevPipeline.Finished, 10)) + + prevCommit := prevPipeline.Commit + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_SHA", prevCommit.Sha) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_REF", prevCommit.Ref) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_REFSPEC", prevCommit.Refspec) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_MESSAGE", prevCommit.Message) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_BRANCH", prevCommit.Branch) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_AUTHOR", prevCommit.Author.Name) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_AUTHOR_EMAIL", prevCommit.Author.Email) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_AUTHOR_AVATAR", prevCommit.Author.Avatar) + if prevPipeline.Event == EventPull || prevPipeline.Event == EventPullClosed { + prevSourceBranch, prevTargetBranch := getSourceTargetBranches(prevCommit.Refspec) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_SOURCE_BRANCH", prevSourceBranch) + setNonEmptyEnvVar(params, "CI_PREV_COMMIT_TARGET_BRANCH", prevTargetBranch) + } + + return params +} + +func (m *Metadata) getPipelineWebURL(pipeline Pipeline, stepNumber int) string { + if stepNumber == 0 { + return fmt.Sprintf("%s/repos/%d/pipeline/%d", m.Sys.URL, m.Repo.ID, pipeline.Number) + } + + return fmt.Sprintf("%s/repos/%d/pipeline/%d/%d", m.Sys.URL, m.Repo.ID, pipeline.Number, stepNumber) +} + func getSourceTargetBranches(refspec string) (string, string) { var ( sourceBranch string @@ -45,124 +177,10 @@ func getSourceTargetBranches(refspec string) (string, string) { return sourceBranch, targetBranch } -// Environ returns the metadata as a map of environment variables. -func (m *Metadata) Environ() map[string]string { - sourceBranch, targetBranch := getSourceTargetBranches(m.Curr.Commit.Refspec) - prevSourceBranch, prevTargetBranch := getSourceTargetBranches(m.Prev.Commit.Refspec) - - params := map[string]string{ - "CI": m.Sys.Name, - "CI_REPO": path.Join(m.Repo.Owner, m.Repo.Name), - "CI_REPO_NAME": m.Repo.Name, - "CI_REPO_OWNER": m.Repo.Owner, - "CI_REPO_REMOTE_ID": m.Repo.RemoteID, - "CI_REPO_SCM": m.Repo.SCM, - "CI_REPO_URL": m.Repo.ForgeURL, - "CI_REPO_CLONE_URL": m.Repo.CloneURL, - "CI_REPO_CLONE_SSH_URL": m.Repo.CloneSSHURL, - "CI_REPO_DEFAULT_BRANCH": m.Repo.Branch, - "CI_REPO_PRIVATE": strconv.FormatBool(m.Repo.Private), - "CI_REPO_TRUSTED_NETWORK": strconv.FormatBool(m.Repo.Trusted.Network), - "CI_REPO_TRUSTED_VOLUMES": strconv.FormatBool(m.Repo.Trusted.Volumes), - "CI_REPO_TRUSTED_SECURITY": strconv.FormatBool(m.Repo.Trusted.Security), - // Deprecated remove in 4.x - "CI_REPO_TRUSTED": strconv.FormatBool(m.Repo.Trusted.Security && m.Repo.Trusted.Network && m.Repo.Trusted.Volumes), - - "CI_COMMIT_SHA": m.Curr.Commit.Sha, - "CI_COMMIT_REF": m.Curr.Commit.Ref, - "CI_COMMIT_REFSPEC": m.Curr.Commit.Refspec, - "CI_COMMIT_BRANCH": m.Curr.Commit.Branch, - "CI_COMMIT_SOURCE_BRANCH": sourceBranch, - "CI_COMMIT_TARGET_BRANCH": targetBranch, - "CI_COMMIT_MESSAGE": m.Curr.Commit.Message, - "CI_COMMIT_AUTHOR": m.Curr.Commit.Author.Name, - "CI_COMMIT_AUTHOR_EMAIL": m.Curr.Commit.Author.Email, - "CI_COMMIT_AUTHOR_AVATAR": m.Curr.Commit.Author.Avatar, - "CI_COMMIT_TAG": "", // will be set if event is tag - "CI_COMMIT_PULL_REQUEST": "", // will be set if event is pull_request or pull_request_closed - "CI_COMMIT_PULL_REQUEST_LABELS": "", // will be set if event is pull_request or pull_request_closed - - "CI_PIPELINE_NUMBER": strconv.FormatInt(m.Curr.Number, 10), - "CI_PIPELINE_PARENT": strconv.FormatInt(m.Curr.Parent, 10), - "CI_PIPELINE_EVENT": m.Curr.Event, - "CI_PIPELINE_URL": m.getPipelineWebURL(m.Curr, 0), - "CI_PIPELINE_FORGE_URL": m.Curr.ForgeURL, - "CI_PIPELINE_DEPLOY_TARGET": m.Curr.DeployTo, - "CI_PIPELINE_DEPLOY_TASK": m.Curr.DeployTask, - "CI_PIPELINE_CREATED": strconv.FormatInt(m.Curr.Created, 10), - "CI_PIPELINE_STARTED": strconv.FormatInt(m.Curr.Started, 10), - - "CI_WORKFLOW_NAME": m.Workflow.Name, - "CI_WORKFLOW_NUMBER": strconv.Itoa(m.Workflow.Number), - - "CI_STEP_NAME": m.Step.Name, - "CI_STEP_NUMBER": strconv.Itoa(m.Step.Number), - "CI_STEP_STARTED": "", // will be set by agent - "CI_STEP_URL": m.getPipelineWebURL(m.Curr, m.Step.Number), - - "CI_PREV_COMMIT_SHA": m.Prev.Commit.Sha, - "CI_PREV_COMMIT_REF": m.Prev.Commit.Ref, - "CI_PREV_COMMIT_REFSPEC": m.Prev.Commit.Refspec, - "CI_PREV_COMMIT_BRANCH": m.Prev.Commit.Branch, - "CI_PREV_COMMIT_URL": m.Prev.ForgeURL, - "CI_PREV_COMMIT_MESSAGE": m.Prev.Commit.Message, - "CI_PREV_COMMIT_AUTHOR": m.Prev.Commit.Author.Name, - "CI_PREV_COMMIT_AUTHOR_EMAIL": m.Prev.Commit.Author.Email, - "CI_PREV_COMMIT_AUTHOR_AVATAR": m.Prev.Commit.Author.Avatar, - "CI_PREV_COMMIT_SOURCE_BRANCH": prevSourceBranch, - "CI_PREV_COMMIT_TARGET_BRANCH": prevTargetBranch, - - "CI_PREV_PIPELINE_NUMBER": strconv.FormatInt(m.Prev.Number, 10), - "CI_PREV_PIPELINE_PARENT": strconv.FormatInt(m.Prev.Parent, 10), - "CI_PREV_PIPELINE_EVENT": m.Prev.Event, - "CI_PREV_PIPELINE_URL": m.getPipelineWebURL(m.Prev, 0), - "CI_PREV_PIPELINE_FORGE_URL": m.Prev.ForgeURL, - "CI_PREV_PIPELINE_DEPLOY_TARGET": m.Prev.DeployTo, - "CI_PREV_PIPELINE_DEPLOY_TASK": m.Prev.DeployTask, - "CI_PREV_PIPELINE_STATUS": m.Prev.Status, - "CI_PREV_PIPELINE_CREATED": strconv.FormatInt(m.Prev.Created, 10), - "CI_PREV_PIPELINE_STARTED": strconv.FormatInt(m.Prev.Started, 10), - "CI_PREV_PIPELINE_FINISHED": strconv.FormatInt(m.Prev.Finished, 10), - - "CI_SYSTEM_NAME": m.Sys.Name, - "CI_SYSTEM_URL": m.Sys.URL, - "CI_SYSTEM_HOST": m.Sys.Host, - "CI_SYSTEM_PLATFORM": m.Sys.Platform, // will be set by pipeline platform option or by agent - "CI_SYSTEM_VERSION": m.Sys.Version, - - "CI_FORGE_TYPE": m.Forge.Type, - "CI_FORGE_URL": m.Forge.URL, +func setNonEmptyEnvVar(env map[string]string, key, value string) { + if len(value) > 0 { + env[key] = value + } else { + log.Trace().Str("variable", key).Msg("env var is filtered as it's empty") } - if m.Curr.Event == EventTag || m.Curr.Event == EventRelease || strings.HasPrefix(m.Curr.Commit.Ref, "refs/tags/") { - params["CI_COMMIT_TAG"] = strings.TrimPrefix(m.Curr.Commit.Ref, "refs/tags/") - } - if m.Curr.Event == EventRelease { - params["CI_COMMIT_PRERELEASE"] = strconv.FormatBool(m.Curr.Commit.IsPrerelease) - } - if m.Curr.Event == EventPull || m.Curr.Event == EventPullClosed { - params["CI_COMMIT_PULL_REQUEST"] = pullRegexp.FindString(m.Curr.Commit.Ref) - params["CI_COMMIT_PULL_REQUEST_LABELS"] = strings.Join(m.Curr.Commit.PullRequestLabels, ",") - } - - // Only export changed files if maxChangedFiles is not exceeded - if len(m.Curr.Commit.ChangedFiles) == 0 { - params["CI_PIPELINE_FILES"] = "[]" - } else if len(m.Curr.Commit.ChangedFiles) <= maxChangedFiles { - // we have to use json, as other separators like ;, or space are valid filename chars - changedFiles, err := json.Marshal(m.Curr.Commit.ChangedFiles) - if err != nil { - log.Error().Err(err).Msg("marshal changed files") - } - params["CI_PIPELINE_FILES"] = string(changedFiles) - } - - return params -} - -func (m *Metadata) getPipelineWebURL(pipeline Pipeline, stepNumber int) string { - if stepNumber == 0 { - return fmt.Sprintf("%s/repos/%d/pipeline/%d", m.Sys.URL, m.Repo.ID, pipeline.Number) - } - - return fmt.Sprintf("%s/repos/%d/pipeline/%d/%d", m.Sys.URL, m.Repo.ID, pipeline.Number, stepNumber) } diff --git a/pipeline/frontend/yaml/compiler/compiler_test.go b/pipeline/frontend/yaml/compiler/compiler_test.go index 99cba479a..89eac902b 100644 --- a/pipeline/frontend/yaml/compiler/compiler_test.go +++ b/pipeline/frontend/yaml/compiler/compiler_test.go @@ -391,8 +391,8 @@ func TestCompilerCompile(t *testing.T) { for _, st := range backConf.Stages { for _, s := range st.Steps { s.UUID = "" - assert.Truef(t, s.Environment["VERBOSE"] == "true", "expect to get value of global set environment") - assert.Truef(t, len(s.Environment) > 50, "expect to have a lot of build in variables") + assert.Truef(t, s.Environment["VERBOSE"] == "true", "expected to get value of global set environment") + assert.Truef(t, len(s.Environment) > 10, "expected to have a lot of built-in variables") s.Environment = nil } } diff --git a/server/api/pipeline.go b/server/api/pipeline.go index fa9d4ce6c..07fefea62 100644 --- a/server/api/pipeline.go +++ b/server/api/pipeline.go @@ -120,6 +120,7 @@ func createTmpPipeline(event model.WebhookEvent, commit *model.Commit, user *mod // @Param branch query string false "filter pipelines by branch" // @Param event query string false "filter pipelines by webhook events (comma separated)" // @Param ref query string false "filter pipelines by strings contained in ref" +// @Param status query string false "filter pipelines by status" func GetPipelines(c *gin.Context) { repo := session.Repo(c) @@ -131,7 +132,7 @@ func GetPipelines(c *gin.Context) { if events := c.Query("event"); events != "" { eventList := strings.Split(events, ",") wel := make(model.WebhookEventList, 0, len(eventList)) - for _, event := range events { + for _, event := range eventList { we := model.WebhookEvent(event) if err := we.Validate(); err != nil { _ = c.AbortWithError(http.StatusBadRequest, err) @@ -142,6 +143,15 @@ func GetPipelines(c *gin.Context) { filter.Events = wel } + if status := c.Query("status"); status != "" { + ps := model.StatusValue(status) + if err := ps.Validate(); err != nil { + _ = c.AbortWithError(http.StatusBadRequest, err) + return + } + filter.Status = ps + } + if before := c.Query("before"); before != "" { beforeDt, err := time.Parse(time.RFC3339, before) if err != nil { diff --git a/server/api/pipeline_test.go b/server/api/pipeline_test.go index 80e2e7965..dd7043cd5 100644 --- a/server/api/pipeline_test.go +++ b/server/api/pipeline_test.go @@ -96,6 +96,24 @@ func TestGetPipelines(t *testing.T) { assert.Equal(t, http.StatusOK, c.Writer.Status()) }) + + t.Run("should filter pipelines by events", func(t *testing.T) { + pipelines := []*model.Pipeline{fakePipeline} + mockStore := store_mocks.NewStore(t) + mockStore.On("GetPipelineList", mock.Anything, mock.Anything, mock.Anything).Return(pipelines, nil) + + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + c.Set("store", mockStore) + c.Request, _ = http.NewRequest(http.MethodGet, "/?event=push,pull_request", nil) + + GetPipelines(c) + + mockStore.AssertCalled(t, "GetPipelineList", mock.Anything, mock.Anything, &model.PipelineFilter{ + Events: model.WebhookEventList{model.EventPush, model.EventPull}, + }) + assert.Equal(t, http.StatusOK, c.Writer.Status()) + }) } func TestDeletePipeline(t *testing.T) { diff --git a/server/model/const.go b/server/model/const.go index 0707473b8..e37171259 100644 --- a/server/model/const.go +++ b/server/model/const.go @@ -66,6 +66,17 @@ const ( StatusCreated StatusValue = "created" // created / internal use only ) +var ErrInvalidStatusValue = errors.New("invalid status value") + +func (s StatusValue) Validate() error { + switch s { + case StatusSkipped, StatusPending, StatusRunning, StatusSuccess, StatusFailure, StatusKilled, StatusError, StatusBlocked, StatusDeclined, StatusCreated: + return nil + default: + return fmt.Errorf("%w: %s", ErrInvalidStatusValue, s) + } +} + // SCMKind represent different version control systems. type SCMKind string // @name SCMKind diff --git a/server/model/pipeline.go b/server/model/pipeline.go index 85270ce19..6268e08a6 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -66,6 +66,7 @@ type PipelineFilter struct { Branch string Events []WebhookEvent RefContains string + Status StatusValue } // IsMultiPipeline checks if step list contain more than one parent step. diff --git a/server/pipeline/stepbuilder/metadata_test.go b/server/pipeline/stepbuilder/metadata_test.go index 1111a5603..005d7b6cd 100644 --- a/server/pipeline/stepbuilder/metadata_test.go +++ b/server/pipeline/stepbuilder/metadata_test.go @@ -43,20 +43,15 @@ func TestMetadataFromStruct(t *testing.T) { name: "Test with empty info", expectedMetadata: metadata.Metadata{Sys: metadata.System{Name: "woodpecker"}}, expectedEnviron: map[string]string{ - "CI": "woodpecker", - "CI_COMMIT_AUTHOR": "", "CI_COMMIT_AUTHOR_AVATAR": "", "CI_COMMIT_AUTHOR_EMAIL": "", "CI_COMMIT_BRANCH": "", - "CI_COMMIT_MESSAGE": "", "CI_COMMIT_PULL_REQUEST": "", "CI_COMMIT_PULL_REQUEST_LABELS": "", "CI_COMMIT_REF": "", "CI_COMMIT_REFSPEC": "", "CI_COMMIT_SHA": "", "CI_COMMIT_SOURCE_BRANCH": "", - "CI_COMMIT_TAG": "", "CI_COMMIT_TARGET_BRANCH": "", "CI_FORGE_TYPE": "", "CI_FORGE_URL": "", - "CI_PIPELINE_CREATED": "0", "CI_PIPELINE_DEPLOY_TARGET": "", "CI_PIPELINE_DEPLOY_TASK": "", "CI_PIPELINE_EVENT": "", "CI_PIPELINE_FILES": "[]", "CI_PIPELINE_NUMBER": "0", - "CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_URL": "/repos/0/pipeline/0", "CI_PIPELINE_FORGE_URL": "", - "CI_PREV_COMMIT_AUTHOR": "", "CI_PREV_COMMIT_AUTHOR_AVATAR": "", "CI_PREV_COMMIT_AUTHOR_EMAIL": "", "CI_PREV_COMMIT_BRANCH": "", "CI_PREV_COMMIT_SOURCE_BRANCH": "", "CI_PREV_COMMIT_TARGET_BRANCH": "", - "CI_PREV_COMMIT_MESSAGE": "", "CI_PREV_COMMIT_REF": "", "CI_PREV_COMMIT_REFSPEC": "", "CI_PREV_COMMIT_SHA": "", "CI_PREV_COMMIT_URL": "", "CI_PREV_PIPELINE_CREATED": "0", - "CI_PREV_PIPELINE_DEPLOY_TARGET": "", "CI_PREV_PIPELINE_DEPLOY_TASK": "", "CI_PREV_PIPELINE_EVENT": "", "CI_PREV_PIPELINE_FINISHED": "0", "CI_PREV_PIPELINE_NUMBER": "0", "CI_PREV_PIPELINE_PARENT": "0", - "CI_PREV_PIPELINE_STARTED": "0", "CI_PREV_PIPELINE_STATUS": "", "CI_PREV_PIPELINE_URL": "/repos/0/pipeline/0", "CI_PREV_PIPELINE_FORGE_URL": "", "CI_REPO": "", "CI_REPO_CLONE_URL": "", "CI_REPO_CLONE_SSH_URL": "", "CI_REPO_DEFAULT_BRANCH": "", "CI_REPO_REMOTE_ID": "", - "CI_REPO_NAME": "", "CI_REPO_OWNER": "", "CI_REPO_PRIVATE": "false", "CI_REPO_SCM": "", "CI_REPO_TRUSTED": "false", "CI_REPO_TRUSTED_NETWORK": "false", - "CI_REPO_TRUSTED_VOLUMES": "false", "CI_REPO_TRUSTED_SECURITY": "false", "CI_REPO_URL": "", - "CI_STEP_NAME": "", "CI_STEP_NUMBER": "0", "CI_STEP_STARTED": "", "CI_STEP_URL": "/repos/0/pipeline/0", "CI_SYSTEM_HOST": "", "CI_SYSTEM_NAME": "woodpecker", - "CI_SYSTEM_PLATFORM": "", "CI_SYSTEM_URL": "", "CI_SYSTEM_VERSION": "", "CI_WORKFLOW_NAME": "", "CI_WORKFLOW_NUMBER": "0", + "CI": "woodpecker", + "CI_PIPELINE_CREATED": "0", "CI_PIPELINE_FILES": "[]", "CI_PIPELINE_NUMBER": "0", + "CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_URL": "/repos/0/pipeline/0", + "CI_PREV_PIPELINE_CREATED": "0", + "CI_PREV_PIPELINE_FINISHED": "0", "CI_PREV_PIPELINE_NUMBER": "0", "CI_PREV_PIPELINE_PARENT": "0", + "CI_PREV_PIPELINE_STARTED": "0", "CI_PREV_PIPELINE_URL": "/repos/0/pipeline/0", + "CI_REPO_PRIVATE": "false", "CI_REPO_TRUSTED": "false", "CI_REPO_TRUSTED_NETWORK": "false", "CI_REPO_TRUSTED_SECURITY": "false", "CI_REPO_TRUSTED_VOLUMES": "false", + "CI_STEP_NUMBER": "0", "CI_STEP_URL": "/repos/0/pipeline/0", "CI_SYSTEM_NAME": "woodpecker", + "CI_WORKFLOW_NUMBER": "0", }, }, { @@ -79,22 +74,17 @@ func TestMetadataFromStruct(t *testing.T) { Workflow: metadata.Workflow{Name: "hello"}, }, expectedEnviron: map[string]string{ - "CI": "woodpecker", - "CI_COMMIT_AUTHOR": "", "CI_COMMIT_AUTHOR_AVATAR": "", "CI_COMMIT_AUTHOR_EMAIL": "", "CI_COMMIT_BRANCH": "", - "CI_COMMIT_MESSAGE": "", "CI_COMMIT_PULL_REQUEST": "", "CI_COMMIT_PULL_REQUEST_LABELS": "", "CI_COMMIT_REF": "", "CI_COMMIT_REFSPEC": "", "CI_COMMIT_SHA": "", "CI_COMMIT_SOURCE_BRANCH": "", - "CI_COMMIT_TAG": "", "CI_COMMIT_TARGET_BRANCH": "", "CI_FORGE_TYPE": "gitea", "CI_FORGE_URL": "https://gitea.com", - "CI_PIPELINE_CREATED": "0", "CI_PIPELINE_DEPLOY_TARGET": "", "CI_PIPELINE_DEPLOY_TASK": "", "CI_PIPELINE_EVENT": "", "CI_PIPELINE_FILES": `["test.go","markdown file.md"]`, - "CI_PIPELINE_NUMBER": "3", "CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_URL": "https://example.com/repos/0/pipeline/3", "CI_PIPELINE_FORGE_URL": "", - "CI_PREV_COMMIT_AUTHOR": "", "CI_PREV_COMMIT_AUTHOR_AVATAR": "", "CI_PREV_COMMIT_AUTHOR_EMAIL": "", "CI_PREV_COMMIT_BRANCH": "", "CI_PREV_COMMIT_SOURCE_BRANCH": "", "CI_PREV_COMMIT_TARGET_BRANCH": "", - "CI_PREV_COMMIT_MESSAGE": "", "CI_PREV_COMMIT_REF": "", "CI_PREV_COMMIT_REFSPEC": "", "CI_PREV_COMMIT_SHA": "", "CI_PREV_COMMIT_URL": "", "CI_PREV_PIPELINE_CREATED": "0", - "CI_PREV_PIPELINE_DEPLOY_TARGET": "", "CI_PREV_PIPELINE_DEPLOY_TASK": "", "CI_PREV_PIPELINE_EVENT": "", "CI_PREV_PIPELINE_FINISHED": "0", "CI_PREV_PIPELINE_NUMBER": "2", "CI_PREV_PIPELINE_PARENT": "0", - "CI_PREV_PIPELINE_STARTED": "0", "CI_PREV_PIPELINE_STATUS": "", "CI_PREV_PIPELINE_URL": "https://example.com/repos/0/pipeline/2", "CI_PREV_PIPELINE_FORGE_URL": "", "CI_REPO": "testUser/testRepo", "CI_REPO_CLONE_URL": "https://gitea.com/testUser/testRepo.git", "CI_REPO_CLONE_SSH_URL": "git@gitea.com:testUser/testRepo.git", - "CI_REPO_DEFAULT_BRANCH": "main", "CI_REPO_NAME": "testRepo", "CI_REPO_OWNER": "testUser", "CI_REPO_PRIVATE": "true", "CI_REPO_REMOTE_ID": "", - "CI_REPO_SCM": "git", "CI_REPO_TRUSTED": "false", "CI_REPO_TRUSTED_NETWORK": "false", - "CI_REPO_TRUSTED_VOLUMES": "false", "CI_REPO_TRUSTED_SECURITY": "false", - "CI_REPO_URL": "https://gitea.com/testUser/testRepo", - "CI_STEP_NAME": "", "CI_STEP_NUMBER": "0", "CI_STEP_STARTED": "", "CI_STEP_URL": "https://example.com/repos/0/pipeline/3", "CI_SYSTEM_HOST": "example.com", - "CI_SYSTEM_NAME": "woodpecker", "CI_SYSTEM_PLATFORM": "", "CI_SYSTEM_URL": "https://example.com", "CI_SYSTEM_VERSION": "", "CI_WORKFLOW_NAME": "hello", "CI_WORKFLOW_NUMBER": "0", + "CI": "woodpecker", + "CI_FORGE_TYPE": "gitea", "CI_FORGE_URL": "https://gitea.com", + "CI_PIPELINE_CREATED": "0", "CI_PIPELINE_FILES": `["test.go","markdown file.md"]`, + "CI_PIPELINE_NUMBER": "3", "CI_PIPELINE_PARENT": "0", "CI_PIPELINE_STARTED": "0", "CI_PIPELINE_URL": "https://example.com/repos/0/pipeline/3", + "CI_PREV_PIPELINE_CREATED": "0", + "CI_PREV_PIPELINE_FINISHED": "0", "CI_PREV_PIPELINE_NUMBER": "2", "CI_PREV_PIPELINE_PARENT": "0", + "CI_PREV_PIPELINE_STARTED": "0", "CI_PREV_PIPELINE_URL": "https://example.com/repos/0/pipeline/2", "CI_REPO": "testUser/testRepo", "CI_REPO_CLONE_URL": "https://gitea.com/testUser/testRepo.git", "CI_REPO_CLONE_SSH_URL": "git@gitea.com:testUser/testRepo.git", + "CI_REPO_DEFAULT_BRANCH": "main", "CI_REPO_NAME": "testRepo", "CI_REPO_OWNER": "testUser", "CI_REPO_PRIVATE": "true", + "CI_REPO_SCM": "git", "CI_REPO_TRUSTED": "false", "CI_REPO_TRUSTED_NETWORK": "false", "CI_REPO_TRUSTED_SECURITY": "false", "CI_REPO_TRUSTED_VOLUMES": "false", + "CI_REPO_URL": "https://gitea.com/testUser/testRepo", "CI_STEP_NUMBER": "0", "CI_STEP_URL": "https://example.com/repos/0/pipeline/3", "CI_SYSTEM_HOST": "example.com", + "CI_SYSTEM_NAME": "woodpecker", "CI_SYSTEM_URL": "https://example.com", "CI_WORKFLOW_NAME": "hello", "CI_WORKFLOW_NUMBER": "0", }, }, } diff --git a/server/store/datastore/pipeline.go b/server/store/datastore/pipeline.go index 33a68e5bb..9a32bf482 100644 --- a/server/store/datastore/pipeline.go +++ b/server/store/datastore/pipeline.go @@ -70,6 +70,10 @@ func (s storage) GetPipelineList(repo *model.Repo, p *model.ListOptions, f *mode cond = cond.And(builder.Eq{"branch": f.Branch}) } + if f.Status != "" { + cond = cond.And(builder.Eq{"status": f.Status}) + } + if len(f.Events) != 0 { cond = cond.And(builder.In("event", f.Events)) } diff --git a/server/store/datastore/pipeline_test.go b/server/store/datastore/pipeline_test.go index fa18a085d..3382faf73 100644 --- a/server/store/datastore/pipeline_test.go +++ b/server/store/datastore/pipeline_test.go @@ -277,6 +277,35 @@ func TestPipelines(t *testing.T) { g.Assert(pipelines[0].ID).Equal(pipeline1.ID) g.Assert(pipelines[0].RepoID).Equal(pipeline1.RepoID) }) + + g.It("Should get pipelines filtered by status", func() { + pipeline1 := &model.Pipeline{ + RepoID: repo.ID, + Status: model.StatusSuccess, + } + pipeline2 := &model.Pipeline{ + RepoID: repo.ID, + Status: model.StatusFailure, + } + pipeline3 := &model.Pipeline{ + RepoID: repo.ID, + Status: model.StatusRunning, + } + err1 := store.CreatePipeline(pipeline1, []*model.Step{}...) + g.Assert(err1).IsNil() + err2 := store.CreatePipeline(pipeline2, []*model.Step{}...) + g.Assert(err2).IsNil() + err3 := store.CreatePipeline(pipeline3, []*model.Step{}...) + g.Assert(err3).IsNil() + + pipelines, err := store.GetPipelineList(&model.Repo{ID: 1}, nil, &model.PipelineFilter{ + Status: model.StatusSuccess, + }) + g.Assert(err).IsNil() + g.Assert(len(pipelines)).Equal(1) + g.Assert(pipelines[0].ID).Equal(pipeline1.ID) + g.Assert(pipelines[0].Status).Equal(model.StatusSuccess) + }) }) } diff --git a/web/.gitignore b/web/.gitignore index 4998cb543..d451ff16c 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -3,4 +3,3 @@ node_modules dist dist-ssr *.local -src/assets/dayjsLocales diff --git a/web/.prettierignore b/web/.prettierignore index 203898907..2087370c5 100644 --- a/web/.prettierignore +++ b/web/.prettierignore @@ -4,5 +4,4 @@ coverage/ LICENSE components.d.ts src/assets/locales/*.json -src/assets/dayjsLocales/ !src/assets/locales/en.json diff --git a/web/eslint.config.js b/web/eslint.config.js index 1b704b719..ac3bf0827 100644 --- a/web/eslint.config.js +++ b/web/eslint.config.js @@ -106,7 +106,6 @@ export default antfu( 'tsconfig.json', 'src/assets/locales/**/*', '!src/assets/locales/en.json', - 'src/assets/dayjsLocales/', 'components.d.ts', ], }, diff --git a/web/package.json b/web/package.json index 83ff5fb20..874f81d49 100644 --- a/web/package.json +++ b/web/package.json @@ -23,7 +23,6 @@ "@mdi/js": "^7.4.47", "@vueuse/core": "^12.0.0", "ansi_up": "^6.0.2", - "dayjs": "^1.11.12", "dompurify": "^3.2.0", "fuse.js": "^7.0.0", "js-base64": "^3.7.7", @@ -57,10 +56,9 @@ "eslint-plugin-vue-scoped-css": "^2.8.1", "jsdom": "^25.0.0", "prettier": "^3.3.3", - "replace-in-file": "^8.1.0", "tinycolor2": "^1.6.0", "typescript": "5.6.3", - "vite": "^5.4.1", + "vite": "^6.0.0", "vite-plugin-prismjs": "^0.0.11", "vite-plugin-windicss": "^1.9.3", "vite-svg-loader": "^5.1.0", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index de6da3438..399030069 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: dependencies: '@intlify/unplugin-vue-i18n': specifier: ^6.0.0 - version: 6.0.0(@vue/compiler-dom@3.5.13)(eslint@9.15.0(jiti@1.21.6))(rollup@4.27.4)(typescript@5.6.3)(vue-i18n@10.0.4(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3)) + version: 6.0.0(@vue/compiler-dom@3.5.13)(eslint@9.16.0(jiti@1.21.6))(rollup@4.28.0)(typescript@5.6.3)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3)) '@kyvg/vue3-notification': specifier: ^3.2.1 version: 3.4.1(vue@3.5.13(typescript@5.6.3)) @@ -26,12 +26,9 @@ importers: ansi_up: specifier: ^6.0.2 version: 6.0.2 - dayjs: - specifier: ^1.11.12 - version: 1.11.13 dompurify: specifier: ^3.2.0 - version: 3.2.1 + version: 3.2.2 fuse.js: specifier: ^7.0.0 version: 7.0.0 @@ -43,13 +40,13 @@ importers: version: 4.17.21 marked: specifier: ^15.0.0 - version: 15.0.2 + version: 15.0.3 node-emoji: specifier: ^2.1.3 version: 2.1.3 pinia: specifier: ^2.2.1 - version: 2.2.6(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) + version: 2.2.8(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)) prismjs: specifier: ^1.29.0 version: 1.29.0 @@ -58,29 +55,29 @@ importers: version: 7.6.3 simple-icons: specifier: ^13.5.0 - version: 13.18.0 + version: 13.19.0 vue: specifier: ^3.4.38 version: 3.5.13(typescript@5.6.3) vue-i18n: specifier: ^10.0.3 - version: 10.0.4(vue@3.5.13(typescript@5.6.3)) + version: 10.0.5(vue@3.5.13(typescript@5.6.3)) vue-router: specifier: ^4.4.3 - version: 4.4.5(vue@3.5.13(typescript@5.6.3)) + version: 4.5.0(vue@3.5.13(typescript@5.6.3)) devDependencies: '@antfu/eslint-config': specifier: ^3.3.2 - version: 3.9.2(@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.13)(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.5(@types/node@22.9.3)(jsdom@25.0.1)(stylus@0.57.0)) + version: 3.11.2(@typescript-eslint/utils@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.13)(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.6(@types/node@22.10.1)(jiti@1.21.6)(jsdom@25.0.1)(stylus@0.57.0)(yaml@2.6.1)) '@eslint/js': specifier: ^9.9.0 - version: 9.15.0 + version: 9.16.0 '@ianvs/prettier-plugin-sort-imports': specifier: ^4.3.1 - version: 4.4.0(@vue/compiler-sfc@3.5.13)(prettier@3.3.3) + version: 4.4.0(@vue/compiler-sfc@3.5.13)(prettier@3.4.1) '@intlify/eslint-plugin-vue-i18n': specifier: 3.1.0 - version: 3.1.0(eslint@9.15.0(jiti@1.21.6)) + version: 3.1.0(eslint@9.16.0(jiti@1.21.6)) '@types/eslint__js': specifier: ^8.42.3 version: 8.42.3 @@ -89,7 +86,7 @@ importers: version: 4.17.13 '@types/node': specifier: ^22.0.0 - version: 22.9.3 + version: 22.10.1 '@types/prismjs': specifier: ^1.26.4 version: 1.26.5 @@ -101,7 +98,7 @@ importers: version: 1.4.6 '@vitejs/plugin-vue': specifier: ^5.1.2 - version: 5.2.0(vite@5.4.11(@types/node@22.9.3)(stylus@0.57.0))(vue@3.5.13(typescript@5.6.3)) + version: 5.2.1(vite@6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1))(vue@3.5.13(typescript@5.6.3)) '@vue/compiler-sfc': specifier: ^3.4.38 version: 3.5.13 @@ -110,22 +107,19 @@ importers: version: 2.4.6 eslint: specifier: ^9.9.0 - version: 9.15.0(jiti@1.21.6) + version: 9.16.0(jiti@1.21.6) eslint-plugin-promise: specifier: ^7.1.0 - version: 7.1.0(eslint@9.15.0(jiti@1.21.6)) + version: 7.2.1(eslint@9.16.0(jiti@1.21.6)) eslint-plugin-vue-scoped-css: specifier: ^2.8.1 - version: 2.8.1(eslint@9.15.0(jiti@1.21.6))(vue-eslint-parser@9.4.3(eslint@9.15.0(jiti@1.21.6))) + version: 2.9.0(eslint@9.16.0(jiti@1.21.6))(vue-eslint-parser@9.4.3(eslint@9.16.0(jiti@1.21.6))) jsdom: specifier: ^25.0.0 version: 25.0.1 prettier: specifier: ^3.3.3 - version: 3.3.3 - replace-in-file: - specifier: ^8.1.0 - version: 8.2.0 + version: 3.4.1 tinycolor2: specifier: ^1.6.0 version: 1.6.0 @@ -133,20 +127,20 @@ importers: specifier: 5.6.3 version: 5.6.3 vite: - specifier: ^5.4.1 - version: 5.4.11(@types/node@22.9.3)(stylus@0.57.0) + specifier: ^6.0.0 + version: 6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1) vite-plugin-prismjs: specifier: ^0.0.11 version: 0.0.11(prismjs@1.29.0) vite-plugin-windicss: specifier: ^1.9.3 - version: 1.9.3(vite@5.4.11(@types/node@22.9.3)(stylus@0.57.0)) + version: 1.9.4(vite@6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1)) vite-svg-loader: specifier: ^5.1.0 version: 5.1.0(vue@3.5.13(typescript@5.6.3)) vitest: specifier: ^2.0.5 - version: 2.1.5(@types/node@22.9.3)(jsdom@25.0.1)(stylus@0.57.0) + version: 2.1.6(@types/node@22.10.1)(jiti@1.21.6)(jsdom@25.0.1)(stylus@0.57.0)(yaml@2.6.1) vue-tsc: specifier: ^2.0.29 version: 2.1.10(typescript@5.6.3) @@ -160,8 +154,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/eslint-config@3.9.2': - resolution: {integrity: sha512-a1I1CXmtQdTL9jxcb2RzKjuYYAzjdKK3ktVpQGd/1S/aUdhKgcEEi3DRXYgnB8xdpYLqracETxEMDf9PQlmyBg==} + '@antfu/eslint-config@3.11.2': + resolution: {integrity: sha512-hoi2MnOdiKL8mIhpMtinwMrqVPq6QVbHPA+BuQD4pqE6yVLyYvjdLFiKApMsezAM+YofCsbhak2oY+JCiIyeNA==} hasBin: true peerDependencies: '@eslint-react/eslint-plugin': ^1.5.8 @@ -175,7 +169,7 @@ packages: eslint-plugin-react-refresh: ^0.4.4 eslint-plugin-solid: ^0.14.3 eslint-plugin-svelte: '>=2.35.1' - prettier-plugin-astro: ^0.13.0 + prettier-plugin-astro: ^0.14.0 prettier-plugin-slidev: ^1.0.5 svelte-eslint-parser: '>=0.37.0' peerDependenciesMeta: @@ -206,8 +200,8 @@ packages: svelte-eslint-parser: optional: true - '@antfu/install-pkg@0.4.1': - resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + '@antfu/install-pkg@0.5.0': + resolution: {integrity: sha512-dKnk2xlAyC7rvTkpkHmu+Qy/2Zc3Vm/l8PtNyIOGDBtXPY3kThfU4ORNEp3V7SXw5XSOb+tOJaUYpfquPzL/Tg==} '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} @@ -293,141 +287,147 @@ packages: resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} engines: {node: '>=16'} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -468,8 +468,8 @@ packages: resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.15.0': - resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} + '@eslint/js@9.16.0': + resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/markdown@6.2.1': @@ -525,12 +525,12 @@ packages: vue-i18n: optional: true - '@intlify/core-base@10.0.4': - resolution: {integrity: sha512-GG428DkrrWCMhxRMRQZjuS7zmSUzarYcaHJqG9VB8dXAxw4iQDoKVQ7ChJRB6ZtsCsX3Jse1PEUlHrJiyQrOTg==} + '@intlify/core-base@10.0.5': + resolution: {integrity: sha512-F3snDTQs0MdvnnyzTDTVkOYVAZOE/MHwRvF7mn7Jw1yuih4NrFYLNYIymGlLmq4HU2iIdzYsZ7f47bOcwY73XQ==} engines: {node: '>= 16'} - '@intlify/core-base@9.14.1': - resolution: {integrity: sha512-rG5/hlNW6Qfve41go37szEf0mVLcfhYuOu83JcY0jZKasnwsrcZYYWDzebCcuO5I/6Sy1JFWo9p+nvkQS1Dy+w==} + '@intlify/core-base@9.14.2': + resolution: {integrity: sha512-DZyQ4Hk22sC81MP4qiCDuU+LdaYW91A6lCjq8AWPvY3+mGMzhGDfOCzvyR6YBQxtlPjFqMoFk9ylnNYRAQwXtQ==} engines: {node: '>= 16'} '@intlify/eslint-plugin-vue-i18n@3.1.0': @@ -539,20 +539,16 @@ packages: peerDependencies: eslint: ^8.0.0 || ^9.0.0-0 - '@intlify/message-compiler@10.0.4': - resolution: {integrity: sha512-AFbhEo10DP095/45EauinQJ5hJ3rJUmuuqltGguvc3WsvezZN+g8qNHLGWKu60FHQVizMrQY7VJ+zVlBXlQQkQ==} + '@intlify/message-compiler@10.0.5': + resolution: {integrity: sha512-6GT1BJ852gZ0gItNZN2krX5QAmea+cmdjMvsWohArAZ3GmHdnNANEcF9JjPXAMRtQ6Ux5E269ymamg/+WU6tQA==} engines: {node: '>= 16'} '@intlify/message-compiler@11.0.0-beta.2': resolution: {integrity: sha512-/cJHP1n45Zlf9tbm/hudLrUwXzJZngR9OMTQk32H1S4lBjM2996wzKTHuLbaJJlJZNTTjnfWZUHPb+F6sE6p1Q==} engines: {node: '>= 16'} - '@intlify/message-compiler@9.14.1': - resolution: {integrity: sha512-MY8hwukJBnXvGAncVKlHsqKDQ5ZcQx4peqEmI8wBUTXn4pezrtTGYXNoz81cLyEEHB+L/zlKWVBSh5TiX4gYoQ==} - engines: {node: '>= 16'} - - '@intlify/shared@10.0.4': - resolution: {integrity: sha512-ukFn0I01HsSgr3VYhYcvkTCLS7rGa0gw4A4AMpcy/A9xx/zRJy7PS2BElMXLwUazVFMAr5zuiTk3MQeoeGXaJg==} + '@intlify/message-compiler@9.14.2': + resolution: {integrity: sha512-YsKKuV4Qv4wrLNsvgWbTf0E40uRv+Qiw1BeLQ0LAxifQuhiMe+hfTIzOMdWj/ZpnTDj4RSZtkXjJM7JDiiB5LQ==} engines: {node: '>= 16'} '@intlify/shared@10.0.5': @@ -563,8 +559,8 @@ packages: resolution: {integrity: sha512-N6ngJfFaVA0l2iLtx/SymgHOBW4wiS5Pyue7YmY/G+mrGjesi+S+U+u/Xlv6pZa/YIBfeM4QB07lI7rz1YqKLg==} engines: {node: '>= 16'} - '@intlify/shared@9.14.1': - resolution: {integrity: sha512-XjHu6PEQup9MnP1x0W9y0nXXfq9jFftAYSfV11hryjtH4XqXP8HrzMvXI+ZVifF+jZLszaTzIhvukllplxTQTg==} + '@intlify/shared@9.14.2': + resolution: {integrity: sha512-uRAHAxYPeF+G5DBIboKpPgC/Waecd4Jz8ihtkpJQD5ycb5PwXp0k/+hBGl5dAjwF7w+l74kz/PKA8r8OK//RUw==} engines: {node: '>= 16'} '@intlify/unplugin-vue-i18n@6.0.0': @@ -660,93 +656,93 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.27.4': - resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} + '@rollup/rollup-android-arm-eabi@4.28.0': + resolution: {integrity: sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.27.4': - resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} + '@rollup/rollup-android-arm64@4.28.0': + resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.27.4': - resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} + '@rollup/rollup-darwin-arm64@4.28.0': + resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.27.4': - resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} + '@rollup/rollup-darwin-x64@4.28.0': + resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.27.4': - resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} + '@rollup/rollup-freebsd-arm64@4.28.0': + resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.27.4': - resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} + '@rollup/rollup-freebsd-x64@4.28.0': + resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': - resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} + '@rollup/rollup-linux-arm-gnueabihf@4.28.0': + resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.27.4': - resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} + '@rollup/rollup-linux-arm-musleabihf@4.28.0': + resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.27.4': - resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} + '@rollup/rollup-linux-arm64-gnu@4.28.0': + resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.27.4': - resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} + '@rollup/rollup-linux-arm64-musl@4.28.0': + resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': - resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': + resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.27.4': - resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} + '@rollup/rollup-linux-riscv64-gnu@4.28.0': + resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.27.4': - resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} + '@rollup/rollup-linux-s390x-gnu@4.28.0': + resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.27.4': - resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} + '@rollup/rollup-linux-x64-gnu@4.28.0': + resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.27.4': - resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} + '@rollup/rollup-linux-x64-musl@4.28.0': + resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.27.4': - resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} + '@rollup/rollup-win32-arm64-msvc@4.28.0': + resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.27.4': - resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} + '@rollup/rollup-win32-ia32-msvc@4.28.0': + resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.27.4': - resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} + '@rollup/rollup-win32-x64-msvc@4.28.0': + resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==} cpu: [x64] os: [win32] @@ -788,8 +784,8 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@22.9.3': - resolution: {integrity: sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==} + '@types/node@22.10.1': + resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -812,8 +808,8 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - '@typescript-eslint/eslint-plugin@8.15.0': - resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + '@typescript-eslint/eslint-plugin@8.16.0': + resolution: {integrity: sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -823,8 +819,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.15.0': - resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + '@typescript-eslint/parser@8.16.0': + resolution: {integrity: sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -833,12 +829,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + '@typescript-eslint/scope-manager@8.16.0': + resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.15.0': - resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + '@typescript-eslint/type-utils@8.16.0': + resolution: {integrity: sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -847,12 +843,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + '@typescript-eslint/types@8.16.0': + resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + '@typescript-eslint/typescript-estree@8.16.0': + resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -860,8 +856,8 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + '@typescript-eslint/utils@8.16.0': + resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -870,19 +866,19 @@ packages: typescript: optional: true - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + '@typescript-eslint/visitor-keys@8.16.0': + resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-vue@5.2.0': - resolution: {integrity: sha512-7n7KdUEtx/7Yl7I/WVAMZ1bEb0eVvXF3ummWTeLcs/9gvo9pJhuLdouSXGjdZ/MKD1acf1I272+X0RMua4/R3g==} + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vitest/eslint-plugin@1.1.10': - resolution: {integrity: sha512-uScH5Kz5v32vvtQYB2iodpoPg2mGASK+VKpjlc2IUgE0+16uZKqVKi2vQxjxJ6sMCQLBs4xhBFZlmZBszsmfKQ==} + '@vitest/eslint-plugin@1.1.13': + resolution: {integrity: sha512-oabbCT4fCQfmFNtH2UuDfHx1d7dzi+VD3qwCpBfECfyzQq/Re9u7qTtE2WqV/hAuAOALw3ZVRiub2mXmpTyn/Q==} peerDependencies: '@typescript-eslint/utils': '>= 8.0' eslint: '>= 8.57.0' @@ -894,34 +890,34 @@ packages: vitest: optional: true - '@vitest/expect@2.1.5': - resolution: {integrity: sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==} + '@vitest/expect@2.1.6': + resolution: {integrity: sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==} - '@vitest/mocker@2.1.5': - resolution: {integrity: sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==} + '@vitest/mocker@2.1.6': + resolution: {integrity: sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@2.1.5': - resolution: {integrity: sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==} + '@vitest/pretty-format@2.1.6': + resolution: {integrity: sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==} - '@vitest/runner@2.1.5': - resolution: {integrity: sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==} + '@vitest/runner@2.1.6': + resolution: {integrity: sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==} - '@vitest/snapshot@2.1.5': - resolution: {integrity: sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==} + '@vitest/snapshot@2.1.6': + resolution: {integrity: sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==} - '@vitest/spy@2.1.5': - resolution: {integrity: sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==} + '@vitest/spy@2.1.6': + resolution: {integrity: sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==} - '@vitest/utils@2.1.5': - resolution: {integrity: sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==} + '@vitest/utils@2.1.6': + resolution: {integrity: sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==} '@volar/language-core@2.4.10': resolution: {integrity: sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==} @@ -987,11 +983,11 @@ packages: '@vueuse/shared@12.0.0': resolution: {integrity: sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==} - '@windicss/config@1.9.3': - resolution: {integrity: sha512-u8GUjsfC9r5X1AGYhzb1lX3zZj8wqk6SH1DYex8XUGmZ1M2UpvnUPOFi63XFViduspQ6l2xTX84QtG+lUzhEoQ==} + '@windicss/config@1.9.4': + resolution: {integrity: sha512-vKXJlEC01/LFuYLF6XZsrCv13QKsxByWFqzDRctTva+O4yqr5j0e5VWB4Dr2tgzVbZuYG5ewg7qywAI/9JD0Cw==} - '@windicss/plugin-utils@1.9.3': - resolution: {integrity: sha512-3VG5HEGeuIfG/9iTwLyzWWm/aGKNTbtSVkpkAabdRuDP/2lEmf6Hpo4uo5drwE+2O9gXfc6nSYgAwBjotx5CfQ==} + '@windicss/plugin-utils@1.9.4': + resolution: {integrity: sha512-GUAX0z+wnq6Rn3+YGJli/keGja73+a6I/PtTpH8EMlNNHrHBbqsbyY5+25QagV39rHwTe/IbkiSdD3csP8L6MA==} abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} @@ -1107,10 +1103,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -1214,9 +1206,6 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -1279,8 +1268,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.2.1: - resolution: {integrity: sha512-NBHEsc0/kzRYQd+AY6HR6B/IgsqzBABrqJbpCDQII/OK6h7B7LXzweZTDsqSW2LkTRpoxf18YUP+YjGySk6B3w==} + dompurify@3.2.2: + resolution: {integrity: sha512-YMM+erhdZ2nkZ4fTNRTSI94mb7VG7uVF5vj5Zde7tImgnhZE3R6YW/IACGIHb2ux+QkEXMhe591N+5jWOmL4Zw==} domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} @@ -1293,8 +1282,8 @@ packages: engines: {node: '>=14'} hasBin: true - electron-to-chromium@1.5.64: - resolution: {integrity: sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==} + electron-to-chromium@1.5.67: + resolution: {integrity: sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1319,9 +1308,9 @@ packages: es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -1351,8 +1340,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-compat-utils@0.6.3: - resolution: {integrity: sha512-9IDdksh5pUYP2ZLi7mOdROxVjLY8gY2qKxprmrJ/5Dyqud7M/IFKxF3o0VLlRhITm1pK6Fk7NiBxE39M/VlUcw==} + eslint-compat-utils@0.6.4: + resolution: {integrity: sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' @@ -1406,8 +1395,8 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 - eslint-plugin-jsdoc@50.5.0: - resolution: {integrity: sha512-xTkshfZrUbiSHXBwZ/9d5ulZ2OcHXxSvm/NPo494H/hadLRJwOq5PMV0EUpMqsb9V+kQo+9BAgi6Z7aJtdBp2A==} + eslint-plugin-jsdoc@50.6.0: + resolution: {integrity: sha512-tCNp4fR79Le3dYTPB0dKEv7yFyvGkUCa+Z3yuTrrNGGOxBlXo9Pn0PEgroOZikUQOGjxoGMVKNjrOHcYEdfszg==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -1428,27 +1417,14 @@ packages: resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} engines: {node: '>=5.0.0'} - eslint-plugin-perfectionist@3.9.1: - resolution: {integrity: sha512-9WRzf6XaAxF4Oi5t/3TqKP5zUjERhasHmLFHin2Yw6ZAp/EP/EVA2dr3BhQrrHWCm5SzTMZf0FcjDnBkO2xFkA==} + eslint-plugin-perfectionist@4.1.2: + resolution: {integrity: sha512-YjXPWB/rKe/gPUsyuxw75wTUrzN5MuJnRV0PH9NoonFvgcdVIXk551mkBKPr59nRZCbu7S3dFHwfo4gA42DB2w==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - astro-eslint-parser: ^1.0.2 eslint: '>=8.0.0' - svelte: '>=3.0.0' - svelte-eslint-parser: ^0.41.1 - vue-eslint-parser: '>=9.0.0' - peerDependenciesMeta: - astro-eslint-parser: - optional: true - svelte: - optional: true - svelte-eslint-parser: - optional: true - vue-eslint-parser: - optional: true - eslint-plugin-promise@7.1.0: - resolution: {integrity: sha512-8trNmPxdAy3W620WKDpaS65NlM5yAumod6XeC4LOb+jxlkG4IVcp68c6dXY2ev+uT4U1PtG57YDV6EGAXN0GbQ==} + eslint-plugin-promise@7.2.1: + resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -1480,21 +1456,21 @@ packages: '@typescript-eslint/eslint-plugin': optional: true - eslint-plugin-vue-scoped-css@2.8.1: - resolution: {integrity: sha512-V6B+zZE60ykYvHTDzdhJ3xa4C83ntmGXqFsylc8l1jdVR9PSgod2+bGFNL7OwRKgZj82ij/o904xa04z1bfCRA==} + eslint-plugin-vue-scoped-css@2.9.0: + resolution: {integrity: sha512-zXeKtEUpfk3PlsgKnr9/2U8K2xcsCV1M9hXWRhKbl3wipVowGXfHrhqUzHFVWNAHzEQv0DCDXGFWrmsGFqhGGA==} engines: {node: ^12.22 || ^14.17 || >=16} peerDependencies: eslint: '>=5.0.0' vue-eslint-parser: '>=7.1.0' - eslint-plugin-vue@9.31.0: - resolution: {integrity: sha512-aYMUCgivhz1o4tLkRHj5oq9YgYPM4/EJc0M7TAKRLCUA5OYxRLAhYEVD2nLtTwLyixEFI+/QXSvKU9ESZFgqjQ==} + eslint-plugin-vue@9.32.0: + resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-yml@1.15.0: - resolution: {integrity: sha512-leC8APYVOsKyWUlvRwVhewytK5wS70BfMqIaUplFstRfzCoVp0YoEroV4cUEvQrBj93tQ3M9LcjO/ewr6D4kjA==} + eslint-plugin-yml@1.16.0: + resolution: {integrity: sha512-t4MNCetPjTn18/fUDlQ/wKkcYjnuLYKChBrZ0qUaNqRigVqChHWzTP8SrfFi5s4keX3vdlkWRSu8zHJMdKwxWQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' @@ -1521,8 +1497,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.15.0: - resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} + eslint@9.16.0: + resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1678,8 +1654,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.12.0: - resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} + globals@15.13.0: + resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} engines: {node: '>=18'} graceful-fs@4.2.11: @@ -1900,14 +1876,14 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-string@0.30.13: - resolution: {integrity: sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==} + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@15.0.2: - resolution: {integrity: sha512-85RUkoYKIVB21PbMKrnD6aCl9ws+XKEyhJNMbLn206NyD3jbBo7Ec7Wi4Jrsn4dV1a2ng7K/jfkmIN0DNoS41w==} + marked@15.0.3: + resolution: {integrity: sha512-Ai0cepvl2NHnTcO9jYDtcOEtVBNVYR31XnEA3BndO7f5As1wzpcOceSUM8FDkNLJNIODcLpDTWay/qQhqbuMvg==} engines: {node: '>= 18'} hasBin: true @@ -2078,17 +2054,18 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + natural-orderby@5.0.0: + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} + engines: {node: '>=18'} + node-emoji@2.1.3: resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} engines: {node: '>=18'} @@ -2107,8 +2084,8 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.13: - resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2140,8 +2117,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.5: - resolution: {integrity: sha512-3dS7y28uua+UDbRCLBqltMBrbI+A5U2mI9YuxHRxIWYmLj3DwntEBmERYzIAQ4DMeuCUOBSak7dBHHoXKpOTYQ==} + package-manager-detector@0.2.6: + resolution: {integrity: sha512-9vPH3qooBlYRJdmdYP00nvjZOulm40r5dhtal8st18ctf+6S1k7pi5yIHLvI4w5D70x0Y+xdVD9qITH0QO/A8A==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -2202,8 +2179,8 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pinia@2.2.6: - resolution: {integrity: sha512-vIsR8JkDN5Ga2vAxqOE2cJj4VtsHnzpR1Fz30kClxlh0yCHfec6uoMeM3e/ddqmwFUejK3NlrcQa/shnpyT4hA==} + pinia@2.2.8: + resolution: {integrity: sha512-NRTYy2g+kju5tBRe0oNlriZIbMNvma8ZJrpHsp3qudyiMEA8jMmPPKQ2QMHg0Oc4BkUyQYWagACabrwriCK9HQ==} peerDependencies: '@vue/composition-api': ^1.4.0 typescript: '>=4.4.4' @@ -2249,8 +2226,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.4.1: + resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==} engines: {node: '>=14'} hasBin: true @@ -2295,11 +2272,6 @@ packages: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true - replace-in-file@8.2.0: - resolution: {integrity: sha512-hMsQtdYHwWviQT5ZbNsgfu0WuCiNlcUSnnD+aHAL081kbU9dPkPocDaHlDvAHKydTWWpx1apfcEcmvIyQk3CpQ==} - engines: {node: '>=18'} - hasBin: true - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -2319,8 +2291,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.27.4: - resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} + rollup@4.28.0: + resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2364,8 +2336,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-icons@13.18.0: - resolution: {integrity: sha512-nxG6XOUKWgt0K7eochrIn46tLBvOcUhcSpVUwWpo8WRkS4RHxreRIRosScDm4KmmTeDuNbW114GjviHlOSWyTg==} + simple-icons@13.19.0: + resolution: {integrity: sha512-N4mUzqRGm1/V3IRyxibGZXwPO1QdwIZmZADn7O6oam2Rz/vnf8TaysvwMy3gIobObthROroa9/oXN31E9gI3zA==} engines: {node: '>=0.12.18'} sisteransi@1.0.5: @@ -2495,11 +2467,11 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tldts-core@6.1.64: - resolution: {integrity: sha512-uqnl8vGV16KsyflHOzqrYjjArjfXaU6rMPXYy2/ZWoRKCkXtghgB4VwTDXUG+t0OTGeSewNAG31/x1gCTfLt+Q==} + tldts-core@6.1.65: + resolution: {integrity: sha512-Uq5t0N0Oj4nQSbU8wFN1YYENvMthvwU13MQrMJRspYCGLSAZjAfoBOJki5IQpnBM/WFskxxC/gIOTwaedmHaSg==} - tldts@6.1.64: - resolution: {integrity: sha512-ph4AE5BXWIOsSy9stpoeo7bYe/Cy7VfpciIH4RhVZUPItCJmhqWCN0EVzxd8BOHiyNb42vuJc6NWTjJkg91Tuw==} + tldts@6.1.65: + resolution: {integrity: sha512-xU9gLTfAGsADQ2PcWee6Hg8RFAv0DnjMGVJmDnUmI8a9+nYmapMQix4afwrdaCtT+AqP4MaxEzu7cCrYmBPbzQ==} hasBin: true to-regex-range@5.0.1: @@ -2518,8 +2490,8 @@ packages: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} - ts-api-utils@1.4.1: - resolution: {integrity: sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -2551,8 +2523,8 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} @@ -2589,41 +2561,46 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vite-node@2.1.5: - resolution: {integrity: sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-node@2.1.6: + resolution: {integrity: sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite-plugin-prismjs@0.0.11: resolution: {integrity: sha512-20NBQxg/zH+3FTrlU6BQTob720xkuXNYtrx7psAQ4E6pMcRDeLEK77QU9kXURU587+f2To7ASH1JVTGbXVV/vQ==} engines: {node: '>=12.0.0'} - vite-plugin-windicss@1.9.3: - resolution: {integrity: sha512-PqNiIsrEftCrgn0xIpj8ZMSdpz8NZn+OJ3gKXnOF+hFzbHFrKGJA49ViOUKCHDOquxoGBZMmTjepWr8GrftKcQ==} + vite-plugin-windicss@1.9.4: + resolution: {integrity: sha512-3t1AUVrs2XBXGc2BefRPRvy1CLy8qA/5A1J1Z73Ej1DIx+puXn39MQSWluxZ2FHEz8z9OEIvsoIIPc/s/P3OmQ==} peerDependencies: - vite: ^2.0.1 || ^3.0.0 || ^4.0.0 || ^5.0.0 + vite: '*' vite-svg-loader@5.1.0: resolution: {integrity: sha512-M/wqwtOEjgb956/+m5ZrYT/Iq6Hax0OakWbokj8+9PXOnB7b/4AxESHieEtnNEy7ZpjsjYW1/5nK8fATQMmRxw==} peerDependencies: vue: '>=3.2.13' - vite@5.4.11: - resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@6.0.2: + resolution: {integrity: sha512-XdQ+VsY2tJpBsKGs0wf3U/+azx8BBpYRHFAyKm5VeEZNOJZRB63q7Sc8Iup3k0TrN3KO6QgyzFf+opSbfY1y0g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 sass: '*' sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -2638,16 +2615,20 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true - vitest@2.1.5: - resolution: {integrity: sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@2.1.6: + resolution: {integrity: sha512-isUCkvPL30J4c5O5hgONeFRsDmlw6kzFEdLQHLezmDdKQHy8Ke/B/dgdTMEgU0vm+iZ0TjW8GuK83DiahBoKWQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.5 - '@vitest/ui': 2.1.5 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 2.1.6 + '@vitest/ui': 2.1.6 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2687,14 +2668,14 @@ packages: peerDependencies: eslint: '>=6.0.0' - vue-i18n@10.0.4: - resolution: {integrity: sha512-1xkzVxqBLk2ZFOmeI+B5r1J7aD/WtNJ4j9k2mcFcQo5BnOmHBmD7z4/oZohh96AAaRZ4Q7mNQvxc9h+aT+Md3w==} + vue-i18n@10.0.5: + resolution: {integrity: sha512-9/gmDlCblz3i8ypu/afiIc/SUIfTTE1mr0mZhb9pk70xo2csHAM9mp2gdQ3KD2O0AM3Hz/5ypb+FycTj/lHlPQ==} engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 - vue-router@4.4.5: - resolution: {integrity: sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==} + vue-router@4.5.0: + resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} peerDependencies: vue: ^3.2.0 @@ -2826,42 +2807,42 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/eslint-config@3.9.2(@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.13)(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.5(@types/node@22.9.3)(jsdom@25.0.1)(stylus@0.57.0))': + '@antfu/eslint-config@3.11.2(@typescript-eslint/utils@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(@vue/compiler-sfc@3.5.13)(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.6(@types/node@22.10.1)(jiti@1.21.6)(jsdom@25.0.1)(stylus@0.57.0)(yaml@2.6.1))': dependencies: - '@antfu/install-pkg': 0.4.1 + '@antfu/install-pkg': 0.5.0 '@clack/prompts': 0.8.2 - '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.16.0(jiti@1.21.6)) '@eslint/markdown': 6.2.1 - '@stylistic/eslint-plugin': 2.11.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@vitest/eslint-plugin': 1.1.10(@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.5(@types/node@22.9.3)(jsdom@25.0.1)(stylus@0.57.0)) - eslint: 9.15.0(jiti@1.21.6) - eslint-config-flat-gitignore: 0.3.0(eslint@9.15.0(jiti@1.21.6)) + '@stylistic/eslint-plugin': 2.11.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + '@vitest/eslint-plugin': 1.1.13(@typescript-eslint/utils@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.6(@types/node@22.10.1)(jiti@1.21.6)(jsdom@25.0.1)(stylus@0.57.0)(yaml@2.6.1)) + eslint: 9.16.0(jiti@1.21.6) + eslint-config-flat-gitignore: 0.3.0(eslint@9.16.0(jiti@1.21.6)) eslint-flat-config-utils: 0.4.0 - eslint-merge-processors: 0.1.0(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-antfu: 2.7.0(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-command: 0.2.6(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-import-x: 4.4.3(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - eslint-plugin-jsdoc: 50.5.0(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-jsonc: 2.18.2(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-n: 17.14.0(eslint@9.15.0(jiti@1.21.6)) + eslint-merge-processors: 0.1.0(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-antfu: 2.7.0(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-command: 0.2.6(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-import-x: 4.4.3(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + eslint-plugin-jsdoc: 50.6.0(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-jsonc: 2.18.2(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-n: 17.14.0(eslint@9.16.0(jiti@1.21.6)) eslint-plugin-no-only-tests: 3.3.0 - eslint-plugin-perfectionist: 3.9.1(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vue-eslint-parser@9.4.3(eslint@9.15.0(jiti@1.21.6))) - eslint-plugin-regexp: 2.7.0(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-toml: 0.11.1(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-unicorn: 56.0.1(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-vue: 9.31.0(eslint@9.15.0(jiti@1.21.6)) - eslint-plugin-yml: 1.15.0(eslint@9.15.0(jiti@1.21.6)) - eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.5.13)(eslint@9.15.0(jiti@1.21.6)) - globals: 15.12.0 + eslint-plugin-perfectionist: 4.1.2(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + eslint-plugin-regexp: 2.7.0(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-toml: 0.11.1(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-unicorn: 56.0.1(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-vue: 9.32.0(eslint@9.16.0(jiti@1.21.6)) + eslint-plugin-yml: 1.16.0(eslint@9.16.0(jiti@1.21.6)) + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.5.13)(eslint@9.16.0(jiti@1.21.6)) + globals: 15.13.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.1 parse-gitignore: 2.0.0 picocolors: 1.1.1 toml-eslint-parser: 0.10.0 - vue-eslint-parser: 9.4.3(eslint@9.15.0(jiti@1.21.6)) + vue-eslint-parser: 9.4.3(eslint@9.16.0(jiti@1.21.6)) yaml-eslint-parser: 1.2.3 yargs: 17.7.2 transitivePeerDependencies: @@ -2869,13 +2850,12 @@ snapshots: - '@typescript-eslint/utils' - '@vue/compiler-sfc' - supports-color - - svelte - typescript - vitest - '@antfu/install-pkg@0.4.1': + '@antfu/install-pkg@0.5.0': dependencies: - package-manager-detector: 0.2.5 + package-manager-detector: 0.2.6 tinyexec: 0.3.1 '@antfu/utils@0.7.10': {} @@ -3005,91 +2985,94 @@ snapshots: esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.24.0': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.24.0': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.24.0': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.24.0': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.24.0': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.24.0': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.24.0': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.24.0': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.24.0': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.24.0': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.24.0': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.24.0': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.24.0': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.24.0': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.24.0': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.24.0': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.24.0': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.24.0': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-arm64@0.24.0': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/openbsd-x64@0.24.0': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/sunos-x64@0.24.0': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-arm64@0.24.0': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-ia32@0.24.0': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.15.0(jiti@1.21.6))': + '@esbuild/win32-x64@0.24.0': + optional: true + + '@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.16.0(jiti@1.21.6))': dependencies: escape-string-regexp: 4.0.0 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) ignore: 5.3.2 - '@eslint-community/eslint-utils@4.4.1(eslint@9.15.0(jiti@1.21.6))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0(jiti@1.21.6))': dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.2.3(eslint@9.15.0(jiti@1.21.6))': + '@eslint/compat@1.2.3(eslint@9.16.0(jiti@1.21.6))': optionalDependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) '@eslint/config-array@0.19.0': dependencies: @@ -3115,7 +3098,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.15.0': {} + '@eslint/js@9.16.0': {} '@eslint/markdown@6.2.1': dependencies: @@ -3145,20 +3128,20 @@ snapshots: '@humanwhocodes/retry@0.4.1': {} - '@ianvs/prettier-plugin-sort-imports@4.4.0(@vue/compiler-sfc@3.5.13)(prettier@3.3.3)': + '@ianvs/prettier-plugin-sort-imports@4.4.0(@vue/compiler-sfc@3.5.13)(prettier@3.4.1)': dependencies: '@babel/generator': 7.26.2 '@babel/parser': 7.26.2 '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 - prettier: 3.3.3 + prettier: 3.4.1 semver: 7.6.3 optionalDependencies: '@vue/compiler-sfc': 3.5.13 transitivePeerDependencies: - supports-color - '@intlify/bundle-utils@10.0.0(vue-i18n@10.0.4(vue@3.5.13(typescript@5.6.3)))': + '@intlify/bundle-utils@10.0.0(vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3)))': dependencies: '@intlify/message-compiler': 11.0.0-beta.2 '@intlify/shared': 11.0.0-beta.2 @@ -3170,28 +3153,28 @@ snapshots: source-map-js: 1.2.1 yaml-eslint-parser: 1.2.3 optionalDependencies: - vue-i18n: 10.0.4(vue@3.5.13(typescript@5.6.3)) + vue-i18n: 10.0.5(vue@3.5.13(typescript@5.6.3)) - '@intlify/core-base@10.0.4': + '@intlify/core-base@10.0.5': dependencies: - '@intlify/message-compiler': 10.0.4 - '@intlify/shared': 10.0.4 + '@intlify/message-compiler': 10.0.5 + '@intlify/shared': 10.0.5 - '@intlify/core-base@9.14.1': + '@intlify/core-base@9.14.2': dependencies: - '@intlify/message-compiler': 9.14.1 - '@intlify/shared': 9.14.1 + '@intlify/message-compiler': 9.14.2 + '@intlify/shared': 9.14.2 - '@intlify/eslint-plugin-vue-i18n@3.1.0(eslint@9.15.0(jiti@1.21.6))': + '@intlify/eslint-plugin-vue-i18n@3.1.0(eslint@9.16.0(jiti@1.21.6))': dependencies: '@eslint/eslintrc': 3.2.0 - '@intlify/core-base': 9.14.1 - '@intlify/message-compiler': 9.14.1 + '@intlify/core-base': 9.14.2 + '@intlify/message-compiler': 9.14.2 debug: 4.3.7 - eslint: 9.15.0(jiti@1.21.6) - eslint-compat-utils: 0.6.3(eslint@9.15.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) + eslint-compat-utils: 0.6.4(eslint@9.16.0(jiti@1.21.6)) glob: 10.4.5 - globals: 15.12.0 + globals: 15.13.0 ignore: 6.0.2 import-fresh: 3.3.0 is-language-code: 3.1.0 @@ -3202,14 +3185,14 @@ snapshots: parse5: 7.2.1 semver: 7.6.3 synckit: 0.9.2 - vue-eslint-parser: 9.4.3(eslint@9.15.0(jiti@1.21.6)) + vue-eslint-parser: 9.4.3(eslint@9.16.0(jiti@1.21.6)) yaml-eslint-parser: 1.2.3 transitivePeerDependencies: - supports-color - '@intlify/message-compiler@10.0.4': + '@intlify/message-compiler@10.0.5': dependencies: - '@intlify/shared': 10.0.4 + '@intlify/shared': 10.0.5 source-map-js: 1.2.1 '@intlify/message-compiler@11.0.0-beta.2': @@ -3217,28 +3200,26 @@ snapshots: '@intlify/shared': 11.0.0-beta.2 source-map-js: 1.2.1 - '@intlify/message-compiler@9.14.1': + '@intlify/message-compiler@9.14.2': dependencies: - '@intlify/shared': 9.14.1 + '@intlify/shared': 9.14.2 source-map-js: 1.2.1 - '@intlify/shared@10.0.4': {} - '@intlify/shared@10.0.5': {} '@intlify/shared@11.0.0-beta.2': {} - '@intlify/shared@9.14.1': {} + '@intlify/shared@9.14.2': {} - '@intlify/unplugin-vue-i18n@6.0.0(@vue/compiler-dom@3.5.13)(eslint@9.15.0(jiti@1.21.6))(rollup@4.27.4)(typescript@5.6.3)(vue-i18n@10.0.4(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))': + '@intlify/unplugin-vue-i18n@6.0.0(@vue/compiler-dom@3.5.13)(eslint@9.16.0(jiti@1.21.6))(rollup@4.28.0)(typescript@5.6.3)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) - '@intlify/bundle-utils': 10.0.0(vue-i18n@10.0.4(vue@3.5.13(typescript@5.6.3))) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) + '@intlify/bundle-utils': 10.0.0(vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3))) '@intlify/shared': 10.0.5 - '@intlify/vue-i18n-extensions': 7.0.0(@intlify/shared@10.0.5)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.4(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3)) - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@intlify/vue-i18n-extensions': 7.0.0(@intlify/shared@10.0.5)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3)) + '@rollup/pluginutils': 5.1.3(rollup@4.28.0) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) debug: 4.3.7 fast-glob: 3.3.2 js-yaml: 4.1.0 @@ -3249,7 +3230,7 @@ snapshots: unplugin: 1.16.0 vue: 3.5.13(typescript@5.6.3) optionalDependencies: - vue-i18n: 10.0.4(vue@3.5.13(typescript@5.6.3)) + vue-i18n: 10.0.5(vue@3.5.13(typescript@5.6.3)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -3257,14 +3238,14 @@ snapshots: - supports-color - typescript - '@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@10.0.5)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.4(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))': + '@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@10.0.5)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))': dependencies: '@babel/parser': 7.26.2 optionalDependencies: '@intlify/shared': 10.0.5 '@vue/compiler-dom': 3.5.13 vue: 3.5.13(typescript@5.6.3) - vue-i18n: 10.0.4(vue@3.5.13(typescript@5.6.3)) + vue-i18n: 10.0.5(vue@3.5.13(typescript@5.6.3)) '@isaacs/cliui@8.0.2': dependencies: @@ -3317,74 +3298,74 @@ snapshots: '@pkgr/core@0.1.1': {} - '@rollup/pluginutils@5.1.3(rollup@4.27.4)': + '@rollup/pluginutils@5.1.3(rollup@4.28.0)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.27.4 + rollup: 4.28.0 - '@rollup/rollup-android-arm-eabi@4.27.4': + '@rollup/rollup-android-arm-eabi@4.28.0': optional: true - '@rollup/rollup-android-arm64@4.27.4': + '@rollup/rollup-android-arm64@4.28.0': optional: true - '@rollup/rollup-darwin-arm64@4.27.4': + '@rollup/rollup-darwin-arm64@4.28.0': optional: true - '@rollup/rollup-darwin-x64@4.27.4': + '@rollup/rollup-darwin-x64@4.28.0': optional: true - '@rollup/rollup-freebsd-arm64@4.27.4': + '@rollup/rollup-freebsd-arm64@4.28.0': optional: true - '@rollup/rollup-freebsd-x64@4.27.4': + '@rollup/rollup-freebsd-x64@4.28.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + '@rollup/rollup-linux-arm-gnueabihf@4.28.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.27.4': + '@rollup/rollup-linux-arm-musleabihf@4.28.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.27.4': + '@rollup/rollup-linux-arm64-gnu@4.28.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.27.4': + '@rollup/rollup-linux-arm64-musl@4.28.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.27.4': + '@rollup/rollup-linux-riscv64-gnu@4.28.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.27.4': + '@rollup/rollup-linux-s390x-gnu@4.28.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.27.4': + '@rollup/rollup-linux-x64-gnu@4.28.0': optional: true - '@rollup/rollup-linux-x64-musl@4.27.4': + '@rollup/rollup-linux-x64-musl@4.28.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.27.4': + '@rollup/rollup-win32-arm64-msvc@4.28.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.27.4': + '@rollup/rollup-win32-ia32-msvc@4.28.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.27.4': + '@rollup/rollup-win32-x64-msvc@4.28.0': optional: true '@sindresorhus/is@4.6.0': {} - '@stylistic/eslint-plugin@2.11.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + '@stylistic/eslint-plugin@2.11.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.15.0(jiti@1.21.6) + '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.16.0(jiti@1.21.6) eslint-visitor-keys: 4.2.0 espree: 10.3.0 estraverse: 5.3.0 @@ -3420,9 +3401,9 @@ snapshots: '@types/ms@0.7.34': {} - '@types/node@22.9.3': + '@types/node@22.10.1': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 '@types/normalize-package-data@2.4.4': {} @@ -3439,138 +3420,138 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 - eslint: 9.15.0(jiti@1.21.6) + '@typescript-eslint/parser': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/type-utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.16.0 + eslint: 9.16.0(jiti@1.21.6) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.1(typescript@5.6.3) + ts-api-utils: 1.4.3(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.7 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.15.0': + '@typescript-eslint/scope-manager@8.16.0': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 - '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) debug: 4.3.7 - eslint: 9.15.0(jiti@1.21.6) - ts-api-utils: 1.4.1(typescript@5.6.3) + eslint: 9.16.0(jiti@1.21.6) + ts-api-utils: 1.4.3(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/types@8.16.0': {} - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.16.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.4.1(typescript@5.6.3) + ts-api-utils: 1.4.3(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/utils@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - eslint: 9.15.0(jiti@1.21.6) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) + eslint: 9.16.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.15.0': + '@typescript-eslint/visitor-keys@8.16.0': dependencies: - '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/types': 8.16.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.0(vite@5.4.11(@types/node@22.9.3)(stylus@0.57.0))(vue@3.5.13(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.1(vite@6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1))(vue@3.5.13(typescript@5.6.3))': dependencies: - vite: 5.4.11(@types/node@22.9.3)(stylus@0.57.0) + vite: 6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1) vue: 3.5.13(typescript@5.6.3) - '@vitest/eslint-plugin@1.1.10(@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.5(@types/node@22.9.3)(jsdom@25.0.1)(stylus@0.57.0))': + '@vitest/eslint-plugin@1.1.13(@typescript-eslint/utils@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3)(vitest@2.1.6(@types/node@22.10.1)(jiti@1.21.6)(jsdom@25.0.1)(stylus@0.57.0)(yaml@2.6.1))': dependencies: - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.15.0(jiti@1.21.6) + '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.16.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 - vitest: 2.1.5(@types/node@22.9.3)(jsdom@25.0.1)(stylus@0.57.0) + vitest: 2.1.6(@types/node@22.10.1)(jiti@1.21.6)(jsdom@25.0.1)(stylus@0.57.0)(yaml@2.6.1) - '@vitest/expect@2.1.5': + '@vitest/expect@2.1.6': dependencies: - '@vitest/spy': 2.1.5 - '@vitest/utils': 2.1.5 + '@vitest/spy': 2.1.6 + '@vitest/utils': 2.1.6 chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.5(vite@5.4.11(@types/node@22.9.3)(stylus@0.57.0))': + '@vitest/mocker@2.1.6(vite@6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1))': dependencies: - '@vitest/spy': 2.1.5 + '@vitest/spy': 2.1.6 estree-walker: 3.0.3 - magic-string: 0.30.13 + magic-string: 0.30.14 optionalDependencies: - vite: 5.4.11(@types/node@22.9.3)(stylus@0.57.0) + vite: 6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1) - '@vitest/pretty-format@2.1.5': + '@vitest/pretty-format@2.1.6': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.5': + '@vitest/runner@2.1.6': dependencies: - '@vitest/utils': 2.1.5 + '@vitest/utils': 2.1.6 pathe: 1.1.2 - '@vitest/snapshot@2.1.5': + '@vitest/snapshot@2.1.6': dependencies: - '@vitest/pretty-format': 2.1.5 - magic-string: 0.30.13 + '@vitest/pretty-format': 2.1.6 + magic-string: 0.30.14 pathe: 1.1.2 - '@vitest/spy@2.1.5': + '@vitest/spy@2.1.6': dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.5': + '@vitest/utils@2.1.6': dependencies: - '@vitest/pretty-format': 2.1.5 + '@vitest/pretty-format': 2.1.6 loupe: 3.1.2 tinyrainbow: 1.2.0 @@ -3607,7 +3588,7 @@ snapshots: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 estree-walker: 2.0.2 - magic-string: 0.30.13 + magic-string: 0.30.14 postcss: 8.4.49 source-map-js: 1.2.1 @@ -3682,7 +3663,7 @@ snapshots: transitivePeerDependencies: - typescript - '@windicss/config@1.9.3': + '@windicss/config@1.9.4': dependencies: debug: 4.3.7 jiti: 1.21.6 @@ -3690,13 +3671,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@windicss/plugin-utils@1.9.3': + '@windicss/plugin-utils@1.9.4': dependencies: '@antfu/utils': 0.7.10 - '@windicss/config': 1.9.3 + '@windicss/config': 1.9.4 debug: 4.3.7 fast-glob: 3.3.2 - magic-string: 0.30.13 + magic-string: 0.30.14 micromatch: 4.0.8 windicss: 3.5.6 transitivePeerDependencies: @@ -3771,7 +3752,7 @@ snapshots: browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001684 - electron-to-chromium: 1.5.64 + electron-to-chromium: 1.5.67 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.2) @@ -3798,8 +3779,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} - char-regex@1.0.2: {} character-entities@2.0.2: {} @@ -3898,8 +3877,6 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - dayjs@1.11.13: {} - de-indent@1.0.2: {} debug@3.2.7: @@ -3946,7 +3923,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.2.1: + dompurify@3.2.2: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -3965,7 +3942,7 @@ snapshots: minimatch: 9.0.1 semver: 7.6.3 - electron-to-chromium@1.5.64: {} + electron-to-chromium@1.5.67: {} emoji-regex@8.0.0: {} @@ -3986,31 +3963,32 @@ snapshots: es-module-lexer@1.5.4: {} - esbuild@0.21.5: + esbuild@0.24.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 escalade@3.2.0: {} @@ -4028,20 +4006,20 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.1(eslint@9.15.0(jiti@1.21.6)): + eslint-compat-utils@0.5.1(eslint@9.16.0(jiti@1.21.6)): dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) semver: 7.6.3 - eslint-compat-utils@0.6.3(eslint@9.15.0(jiti@1.21.6)): + eslint-compat-utils@0.6.4(eslint@9.16.0(jiti@1.21.6)): dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) semver: 7.6.3 - eslint-config-flat-gitignore@0.3.0(eslint@9.15.0(jiti@1.21.6)): + eslint-config-flat-gitignore@0.3.0(eslint@9.16.0(jiti@1.21.6)): dependencies: - '@eslint/compat': 1.2.3(eslint@9.15.0(jiti@1.21.6)) - eslint: 9.15.0(jiti@1.21.6) + '@eslint/compat': 1.2.3(eslint@9.16.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) find-up-simple: 1.0.0 eslint-flat-config-utils@0.4.0: @@ -4056,39 +4034,39 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-json-compat-utils@0.2.1(eslint@9.15.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0): + eslint-json-compat-utils@0.2.1(eslint@9.16.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0): dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) esquery: 1.6.0 jsonc-eslint-parser: 2.4.0 - eslint-merge-processors@0.1.0(eslint@9.15.0(jiti@1.21.6)): + eslint-merge-processors@0.1.0(eslint@9.16.0(jiti@1.21.6)): dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) - eslint-plugin-antfu@2.7.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-antfu@2.7.0(eslint@9.16.0(jiti@1.21.6)): dependencies: '@antfu/utils': 0.7.10 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) - eslint-plugin-command@0.2.6(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-command@0.2.6(eslint@9.16.0(jiti@1.21.6)): dependencies: '@es-joy/jsdoccomment': 0.48.0 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) - eslint-plugin-es-x@7.8.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-es-x@7.8.0(eslint@9.16.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.15.0(jiti@1.21.6) - eslint-compat-utils: 0.5.1(eslint@9.15.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.16.0(jiti@1.21.6)) - eslint-plugin-import-x@4.4.3(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3): + eslint-plugin-import-x@4.4.3(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) debug: 4.3.7 doctrine: 3.0.0 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.8.1 is-glob: 4.0.3 @@ -4100,14 +4078,14 @@ snapshots: - supports-color - typescript - eslint-plugin-jsdoc@50.5.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-jsdoc@50.6.0(eslint@9.16.0(jiti@1.21.6)): dependencies: '@es-joy/jsdoccomment': 0.49.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.3.7 escape-string-regexp: 4.0.0 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) espree: 10.3.0 esquery: 1.6.0 parse-imports: 2.2.1 @@ -4117,12 +4095,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.18.2(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-jsonc@2.18.2(eslint@9.16.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) - eslint: 9.15.0(jiti@1.21.6) - eslint-compat-utils: 0.6.3(eslint@9.15.0(jiti@1.21.6)) - eslint-json-compat-utils: 0.2.1(eslint@9.15.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) + eslint-compat-utils: 0.6.4(eslint@9.16.0(jiti@1.21.6)) + eslint-json-compat-utils: 0.2.1(eslint@9.16.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 @@ -4131,68 +4109,66 @@ snapshots: transitivePeerDependencies: - '@eslint/json' - eslint-plugin-n@17.14.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-n@17.14.0(eslint@9.16.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) enhanced-resolve: 5.17.1 - eslint: 9.15.0(jiti@1.21.6) - eslint-plugin-es-x: 7.8.0(eslint@9.15.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) + eslint-plugin-es-x: 7.8.0(eslint@9.16.0(jiti@1.21.6)) get-tsconfig: 4.8.1 - globals: 15.12.0 + globals: 15.13.0 ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-perfectionist@3.9.1(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)(vue-eslint-parser@9.4.3(eslint@9.15.0(jiti@1.21.6))): + eslint-plugin-perfectionist@4.1.2(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3): dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.15.0(jiti@1.21.6) - minimatch: 9.0.5 - natural-compare-lite: 1.4.0 - optionalDependencies: - vue-eslint-parser: 9.4.3(eslint@9.15.0(jiti@1.21.6)) + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) + eslint: 9.16.0(jiti@1.21.6) + natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-promise@7.1.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-promise@7.2.1(eslint@9.16.0(jiti@1.21.6)): dependencies: - eslint: 9.15.0(jiti@1.21.6) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) - eslint-plugin-regexp@2.7.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-regexp@2.7.0(eslint@9.16.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) jsdoc-type-pratt-parser: 4.1.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-toml@0.11.1(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-toml@0.11.1(eslint@9.16.0(jiti@1.21.6)): dependencies: debug: 4.3.7 - eslint: 9.15.0(jiti@1.21.6) - eslint-compat-utils: 0.5.1(eslint@9.15.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) + eslint-compat-utils: 0.5.1(eslint@9.16.0(jiti@1.21.6)) lodash: 4.17.21 toml-eslint-parser: 0.10.0 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@56.0.1(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-unicorn@56.0.1(eslint@9.16.0(jiti@1.21.6)): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) ci-info: 4.1.0 clean-regexp: 1.0.0 core-js-compat: 3.39.0 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) esquery: 1.6.0 - globals: 15.12.0 + globals: 15.13.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 jsesc: 3.0.2 @@ -4203,56 +4179,56 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.16.0(jiti@1.21.6)): dependencies: - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.16.0(jiti@1.21.6))(typescript@5.6.3) - eslint-plugin-vue-scoped-css@2.8.1(eslint@9.15.0(jiti@1.21.6))(vue-eslint-parser@9.4.3(eslint@9.15.0(jiti@1.21.6))): + eslint-plugin-vue-scoped-css@2.9.0(eslint@9.16.0(jiti@1.21.6))(vue-eslint-parser@9.4.3(eslint@9.16.0(jiti@1.21.6))): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) - eslint: 9.15.0(jiti@1.21.6) - eslint-compat-utils: 0.5.1(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) + eslint-compat-utils: 0.6.4(eslint@9.16.0(jiti@1.21.6)) lodash: 4.17.21 postcss: 8.4.49 postcss-safe-parser: 6.0.0(postcss@8.4.49) postcss-scss: 4.0.9(postcss@8.4.49) postcss-selector-parser: 6.1.2 postcss-styl: 0.12.3 - vue-eslint-parser: 9.4.3(eslint@9.15.0(jiti@1.21.6)) + vue-eslint-parser: 9.4.3(eslint@9.16.0(jiti@1.21.6)) transitivePeerDependencies: - supports-color - eslint-plugin-vue@9.31.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-vue@9.32.0(eslint@9.16.0(jiti@1.21.6)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) - eslint: 9.15.0(jiti@1.21.6) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.6.3 - vue-eslint-parser: 9.4.3(eslint@9.15.0(jiti@1.21.6)) + vue-eslint-parser: 9.4.3(eslint@9.16.0(jiti@1.21.6)) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-yml@1.15.0(eslint@9.15.0(jiti@1.21.6)): + eslint-plugin-yml@1.16.0(eslint@9.16.0(jiti@1.21.6)): dependencies: debug: 4.3.7 - eslint: 9.15.0(jiti@1.21.6) - eslint-compat-utils: 0.5.1(eslint@9.15.0(jiti@1.21.6)) + eslint: 9.16.0(jiti@1.21.6) + eslint-compat-utils: 0.6.4(eslint@9.16.0(jiti@1.21.6)) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.3 transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.5.13)(eslint@9.15.0(jiti@1.21.6)): + eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.5.13)(eslint@9.16.0(jiti@1.21.6)): dependencies: '@vue/compiler-sfc': 3.5.13 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) eslint-scope@7.2.2: dependencies: @@ -4268,14 +4244,14 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.15.0(jiti@1.21.6): + eslint@9.16.0(jiti@1.21.6): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 '@eslint/core': 0.9.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.15.0 + '@eslint/js': 9.16.0 '@eslint/plugin-kit': 0.2.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -4452,7 +4428,7 @@ snapshots: globals@14.0.0: {} - globals@15.12.0: {} + globals@15.13.0: {} graceful-fs@4.2.11: {} @@ -4578,7 +4554,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.13 + nwsapi: 2.2.16 parse5: 7.2.1 rrweb-cssom: 0.7.1 saxes: 6.0.0 @@ -4659,13 +4635,13 @@ snapshots: dependencies: yallist: 3.1.1 - magic-string@0.30.13: + magic-string@0.30.14: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 markdown-table@3.0.4: {} - marked@15.0.2: {} + marked@15.0.3: {} mdast-util-find-and-replace@3.0.1: dependencies: @@ -5004,12 +4980,12 @@ snapshots: muggle-string@0.4.1: {} - nanoid@3.3.7: {} - - natural-compare-lite@1.4.0: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} + natural-orderby@5.0.0: {} + node-emoji@2.1.3: dependencies: '@sindresorhus/is': 4.6.0 @@ -5034,7 +5010,7 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.13: {} + nwsapi@2.2.16: {} once@1.4.0: dependencies: @@ -5069,7 +5045,7 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.5: {} + package-manager-detector@0.2.6: {} parent-module@1.0.1: dependencies: @@ -5118,7 +5094,7 @@ snapshots: picomatch@4.0.2: {} - pinia@2.2.6(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)): + pinia@2.2.8(typescript@5.6.3)(vue@3.5.13(typescript@5.6.3)): dependencies: '@vue/devtools-api': 6.6.4 vue: 3.5.13(typescript@5.6.3) @@ -5159,13 +5135,13 @@ snapshots: postcss@8.4.49: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier@3.3.3: {} + prettier@3.4.1: {} prismjs@1.29.0: {} @@ -5205,12 +5181,6 @@ snapshots: dependencies: jsesc: 0.5.0 - replace-in-file@8.2.0: - dependencies: - chalk: 5.3.0 - glob: 10.4.5 - yargs: 17.7.2 - require-directory@2.1.1: {} resolve-from@4.0.0: {} @@ -5225,28 +5195,28 @@ snapshots: reusify@1.0.4: {} - rollup@4.27.4: + rollup@4.28.0: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.27.4 - '@rollup/rollup-android-arm64': 4.27.4 - '@rollup/rollup-darwin-arm64': 4.27.4 - '@rollup/rollup-darwin-x64': 4.27.4 - '@rollup/rollup-freebsd-arm64': 4.27.4 - '@rollup/rollup-freebsd-x64': 4.27.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 - '@rollup/rollup-linux-arm-musleabihf': 4.27.4 - '@rollup/rollup-linux-arm64-gnu': 4.27.4 - '@rollup/rollup-linux-arm64-musl': 4.27.4 - '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 - '@rollup/rollup-linux-riscv64-gnu': 4.27.4 - '@rollup/rollup-linux-s390x-gnu': 4.27.4 - '@rollup/rollup-linux-x64-gnu': 4.27.4 - '@rollup/rollup-linux-x64-musl': 4.27.4 - '@rollup/rollup-win32-arm64-msvc': 4.27.4 - '@rollup/rollup-win32-ia32-msvc': 4.27.4 - '@rollup/rollup-win32-x64-msvc': 4.27.4 + '@rollup/rollup-android-arm-eabi': 4.28.0 + '@rollup/rollup-android-arm64': 4.28.0 + '@rollup/rollup-darwin-arm64': 4.28.0 + '@rollup/rollup-darwin-x64': 4.28.0 + '@rollup/rollup-freebsd-arm64': 4.28.0 + '@rollup/rollup-freebsd-x64': 4.28.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.0 + '@rollup/rollup-linux-arm-musleabihf': 4.28.0 + '@rollup/rollup-linux-arm64-gnu': 4.28.0 + '@rollup/rollup-linux-arm64-musl': 4.28.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.0 + '@rollup/rollup-linux-riscv64-gnu': 4.28.0 + '@rollup/rollup-linux-s390x-gnu': 4.28.0 + '@rollup/rollup-linux-x64-gnu': 4.28.0 + '@rollup/rollup-linux-x64-musl': 4.28.0 + '@rollup/rollup-win32-arm64-msvc': 4.28.0 + '@rollup/rollup-win32-ia32-msvc': 4.28.0 + '@rollup/rollup-win32-x64-msvc': 4.28.0 fsevents: 2.3.3 rrweb-cssom@0.7.1: {} @@ -5281,7 +5251,7 @@ snapshots: signal-exit@4.1.0: {} - simple-icons@13.18.0: {} + simple-icons@13.19.0: {} sisteransi@1.0.5: {} @@ -5405,11 +5375,11 @@ snapshots: tinyspy@3.0.2: {} - tldts-core@6.1.64: {} + tldts-core@6.1.65: {} - tldts@6.1.64: + tldts@6.1.65: dependencies: - tldts-core: 6.1.64 + tldts-core: 6.1.65 to-regex-range@5.0.1: dependencies: @@ -5421,13 +5391,13 @@ snapshots: tough-cookie@5.0.0: dependencies: - tldts: 6.1.64 + tldts: 6.1.65 tr46@5.0.0: dependencies: punycode: 2.3.1 - ts-api-utils@1.4.1(typescript@5.6.3): + ts-api-utils@1.4.3(typescript@5.6.3): dependencies: typescript: 5.6.3 @@ -5447,7 +5417,7 @@ snapshots: ufo@1.5.4: {} - undici-types@6.19.8: {} + undici-types@6.20.0: {} unicode-emoji-modifier-base@1.0.0: {} @@ -5492,15 +5462,16 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@2.1.5(@types/node@22.9.3)(stylus@0.57.0): + vite-node@2.1.6(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1): dependencies: cac: 6.7.14 debug: 4.3.7 es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.11(@types/node@22.9.3)(stylus@0.57.0) + vite: 6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass @@ -5509,6 +5480,8 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml vite-plugin-prismjs@0.0.11(prismjs@1.29.0): dependencies: @@ -5518,12 +5491,12 @@ snapshots: - prismjs - supports-color - vite-plugin-windicss@1.9.3(vite@5.4.11(@types/node@22.9.3)(stylus@0.57.0)): + vite-plugin-windicss@1.9.4(vite@6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1)): dependencies: - '@windicss/plugin-utils': 1.9.3 + '@windicss/plugin-utils': 1.9.4 debug: 4.3.7 kolorist: 1.8.0 - vite: 5.4.11(@types/node@22.9.3)(stylus@0.57.0) + vite: 6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1) windicss: 3.5.6 transitivePeerDependencies: - supports-color @@ -5533,42 +5506,45 @@ snapshots: svgo: 3.3.2 vue: 3.5.13(typescript@5.6.3) - vite@5.4.11(@types/node@22.9.3)(stylus@0.57.0): + vite@6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1): dependencies: - esbuild: 0.21.5 + esbuild: 0.24.0 postcss: 8.4.49 - rollup: 4.27.4 + rollup: 4.28.0 optionalDependencies: - '@types/node': 22.9.3 + '@types/node': 22.10.1 fsevents: 2.3.3 + jiti: 1.21.6 stylus: 0.57.0 + yaml: 2.6.1 - vitest@2.1.5(@types/node@22.9.3)(jsdom@25.0.1)(stylus@0.57.0): + vitest@2.1.6(@types/node@22.10.1)(jiti@1.21.6)(jsdom@25.0.1)(stylus@0.57.0)(yaml@2.6.1): dependencies: - '@vitest/expect': 2.1.5 - '@vitest/mocker': 2.1.5(vite@5.4.11(@types/node@22.9.3)(stylus@0.57.0)) - '@vitest/pretty-format': 2.1.5 - '@vitest/runner': 2.1.5 - '@vitest/snapshot': 2.1.5 - '@vitest/spy': 2.1.5 - '@vitest/utils': 2.1.5 + '@vitest/expect': 2.1.6 + '@vitest/mocker': 2.1.6(vite@6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1)) + '@vitest/pretty-format': 2.1.6 + '@vitest/runner': 2.1.6 + '@vitest/snapshot': 2.1.6 + '@vitest/spy': 2.1.6 + '@vitest/utils': 2.1.6 chai: 5.1.2 debug: 4.3.7 expect-type: 1.1.0 - magic-string: 0.30.13 + magic-string: 0.30.14 pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 tinyexec: 0.3.1 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.11(@types/node@22.9.3)(stylus@0.57.0) - vite-node: 2.1.5(@types/node@22.9.3)(stylus@0.57.0) + vite: 6.0.2(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1) + vite-node: 2.1.6(@types/node@22.10.1)(jiti@1.21.6)(stylus@0.57.0)(yaml@2.6.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.9.3 + '@types/node': 22.10.1 jsdom: 25.0.1 transitivePeerDependencies: + - jiti - less - lightningcss - msw @@ -5578,6 +5554,8 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml vscode-uri@3.0.8: {} @@ -5587,10 +5565,10 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.6.3) - vue-eslint-parser@9.4.3(eslint@9.15.0(jiti@1.21.6)): + vue-eslint-parser@9.4.3(eslint@9.16.0(jiti@1.21.6)): dependencies: debug: 4.3.7 - eslint: 9.15.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.6) eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -5600,14 +5578,14 @@ snapshots: transitivePeerDependencies: - supports-color - vue-i18n@10.0.4(vue@3.5.13(typescript@5.6.3)): + vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3)): dependencies: - '@intlify/core-base': 10.0.4 - '@intlify/shared': 10.0.4 + '@intlify/core-base': 10.0.5 + '@intlify/shared': 10.0.5 '@vue/devtools-api': 6.6.4 vue: 3.5.13(typescript@5.6.3) - vue-router@4.4.5(vue@3.5.13(typescript@5.6.3)): + vue-router@4.5.0(vue@3.5.13(typescript@5.6.3)): dependencies: '@vue/devtools-api': 6.6.4 vue: 3.5.13(typescript@5.6.3) diff --git a/web/src/assets/locales/cs.json b/web/src/assets/locales/cs.json index a342567b0..242e2aa2f 100644 --- a/web/src/assets/locales/cs.json +++ b/web/src/assets/locales/cs.json @@ -17,7 +17,7 @@ "delete_agent": "Odstranit agent", "delete_confirm": "Opravdu chcete tohoto agenta odstranit? Už se nebude moci připojit k serveru.", "deleted": "Agent smazán", - "desc": "Agenti registrovaní pro tento server", + "desc": "Agenti registrovaní na tomto serveru.", "edit_agent": "Upravit agent", "id": "ID", "last_contact": "Poslední kontakt", @@ -41,12 +41,12 @@ "token": "Tokeny", "version": "Verze" }, - "not_allowed": "Nemáte povolen přístup k nastavení serveru", + "not_allowed": "K nastavení serveru nemáte přístup.", "orgs": { "delete_confirm": "Opravdu chcete tuto organizaci smazat? Tím se odstraní také všechna úložiště vlastněná touto organizací.", "delete_org": "Odstranit organizaci", "deleted": "Organizace vymazána", - "desc": "Organizace vlastnící úložiště na tomto serveru", + "desc": "Organizace vlastnící repozitáře na tomto serveru.", "none": "Zatím neexistují žádné organizace.", "org_settings": "Organizační nastavení", "orgs": "Organizace", @@ -74,7 +74,7 @@ "waiting_for": "čekání na" }, "repos": { - "desc": "Úložiště, která jsou nebo byla na tomto serveru povolena", + "desc": "Repozitáře, které jsou nebo byly na tomto serveru povoleny.", "disabled": "Bezbariérový", "none": "Zatím neexistují žádná úložiště.", "repos": "Repozitáře", @@ -198,7 +198,7 @@ "success": "Repozitář povoleno" }, "manual_pipeline": { - "select_branch": "Vyberte pobočku", + "select_branch": "Vyberte větev", "title": "Spuštění ručního spuštění potrubí", "trigger": "Spustit potrubí", "variables": { diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json index cba931e00..f02638fea 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -24,8 +24,8 @@ "not_found": "Server could not find requested object" }, "time": { - "template": "MMM D, YYYY, HH:mm z", - "not_started": "not started yet" + "not_started": "not started yet", + "just_now": "just now" }, "repo": { "manual_pipeline": { diff --git a/web/src/assets/locales/fr.json b/web/src/assets/locales/fr.json index 43221f3dd..769d65bf9 100644 --- a/web/src/assets/locales/fr.json +++ b/web/src/assets/locales/fr.json @@ -193,8 +193,8 @@ "add": "Ajouter un dépôt", "branches": "Branches", "deploy_pipeline": { - "enter_target": "Environnement de déploiement ciblé", - "title": "Déclenchement d'un événement de déploiement pour le pipeline courant #{pipelineId}", + "enter_target": "Environnement de 'déploiement' ciblé", + "title": "Déclenchement d'un événement de 'déploiement' pour le pipeline courant #{pipelineId}", "trigger": "Déployer", "variables": { "add": "Ajouter une variable", @@ -365,7 +365,7 @@ "general": { "allow_pr": { "allow": "Autoriser les demandes de fusions", - "desc": "Les pipelines peuvent se déclencher sur les pull requests." + "desc": "Permettre aux pipelines de se déclencher sur les pull requests." }, "cancel_prev": { "cancel": "Annuler les pipelines précédents", @@ -373,8 +373,8 @@ }, "general": "Général", "netrc_only_trusted": { - "desc": "Injecter les identifiants netrc uniquement dans des conteneurs de confiance (recommandé).", - "netrc_only_trusted": "Injecter les identifiants netrc uniquement dans des conteneurs de confiance" + "desc": "Les plugins listés ici auront accès aux identifiants netrc qui peuvent être utiliser pour cloner des dépôts depuis la forge, ou pour pousser vers celle-ci.", + "netrc_only_trusted": "Plugins de clonage personnalisés de confiance" }, "pipeline_path": { "default": "Par défaut : .woodpecker/*.{'{yaml,yml}'} -> .woodpecker.yaml -> .woodpecker.yml", @@ -388,14 +388,23 @@ "protected": "Protégé" }, "save": "Enregistrer les paramètres", - "success": "Paramètres du dépôt mis à jour", + "success": "Paramètres du projet mis à jour", "timeout": { "minutes": "minutes", "timeout": "Délai d’inactivité" }, "trusted": { "desc": "Les conteneurs du pipeline ont accès à des capacités privilégiées (comme le montage de volumes).", - "trusted": "Vérifié" + "trusted": "Vérifié", + "network": { + "network": "Réseau" + }, + "volumes": { + "volumes": "Volumes" + }, + "security": { + "security": "Sécurité" + } }, "visibility": { "internal": { @@ -413,8 +422,8 @@ "visibility": "Visibilité du projet" }, "allow_deploy": { - "allow": "Autoriser les déploiements", - "desc": "Autoriser les déploiements depuis les pipelines ayant réussis. À utiliser que si vous avez confiance dans les utilisateurs ayant un accès en écriture." + "allow": "Autoriser les événements de 'déploiement'.", + "desc": "Permettre les déploiements depuis les pipelines ayant réussis. À utiliser que si vous avez confiance dans les utilisateurs ayant un accès en écriture." } }, "not_allowed": "Vous n'êtes pas autorisé à accéder aux paramètres de ce dépôt", @@ -463,7 +472,22 @@ }, "settings": "Paramètres" }, - "user_none": "Cet(te) organisation / utilisateur n'a pas encore de projets." + "user_none": "Cet(te) organisation / utilisateur n'a pas encore de projets.", + "visibility": { + "visibility": "Visibilité du projet", + "public": { + "public": "Publique", + "desc": "Tout le monde peut voir le projet sans être connecté." + }, + "private": { + "private": "Privé", + "desc": "Seul vous et les propriétaires de ce dépôt peuvent le voir." + }, + "internal": { + "internal": "Interne", + "desc": "Seuls les comptes identifiés sur cet instance de Woodpecker peuvent voir ce projet." + } + } }, "repos": "Dépôt", "repositories": "Dépôts", @@ -476,7 +500,8 @@ "not_started": "pas encore démarré", "sec_short": "sec", "template": "D MMM, YYYY, HH:mm z", - "weeks_short": "s" + "weeks_short": "s", + "just_now": "il y a peu de temps" }, "unknown_error": "Une erreur inconnue est survenue", "update_woodpecker": "Merci de mettre à jour votre instance Woodpecker vers la version {0}", diff --git a/web/src/assets/locales/hu.json b/web/src/assets/locales/hu.json index 0967ef424..1a2be04bf 100644 --- a/web/src/assets/locales/hu.json +++ b/web/src/assets/locales/hu.json @@ -1 +1,67 @@ -{} +{ + "back": "Vissza", + "logout": "Kijelentkezés", + "search": "Keresés…", + "username": "Felhasználónév", + "unknown_error": "Ismeretlen hiba történt", + "password": "Jelszó", + "repo": { + "visibility": { + "public": { + "public": "Nyilvános" + }, + "private": { + "private": "Privát", + "desc": "Csak te és a többi tulajdonos láthatjátok ezt a projektet a tárolóban." + }, + "internal": { + "internal": "Belső" + } + }, + "settings": { + "general": { + "timeout": { + "minutes": "percek" + }, + "save": "Beállítások mentése", + "project": "Projekt beállítások", + "success": "Projekt beállítások frissítve" + }, + "actions": { + "disable": { + "disable": "Tároló inaktiválása" + }, + "delete": { + "delete": "Tároló törlése" + } + } + }, + "pipeline": { + "loading": "Betöltés…" + } + }, + "admin": { + "settings": { + "users": { + "show": "Mutasd a felhasználokat", + "cancel": "Mégse", + "save": "Felhasználó mentése", + "add": "Felhasználó hozzáadása", + "deleted": "Felhasználó törölve", + "created": "Felhasználó létrehozva", + "saved": "Felhasználó mentve", + "delete_user": "Felhasználó törlése", + "edit_user": "Felhasználó szerkesztése" + }, + "orgs": { + "orgs": "Szervezetek", + "delete_org": "Szervezet törlése" + } + } + }, + "cancel": "Mégse", + "login": "Bejelentkezés", + "internal_error": "Valamilyen belső hiba történt", + "info": "Információ", + "registration_closed": "A regisztráció zárva" +} diff --git a/web/src/components/atomic/Badge.vue b/web/src/components/atomic/Badge.vue index c8bd5d5be..64e31ddf0 100644 --- a/web/src/components/atomic/Badge.vue +++ b/web/src/components/atomic/Badge.vue @@ -1,14 +1,17 @@