From 1d961495f30a888d3c9301fc529bfdd7f0a67c04 Mon Sep 17 00:00:00 2001 From: JakobDev Date: Mon, 14 Oct 2024 19:24:56 +0200 Subject: [PATCH 01/75] fix: regression from #4125 --- templates/repo/issue/openclose.tmpl | 10 ++++++---- tests/integration/milestone_test.go | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/templates/repo/issue/openclose.tmpl b/templates/repo/issue/openclose.tmpl index 5de1d1f639..4c2d69355b 100644 --- a/templates/repo/issue/openclose.tmpl +++ b/templates/repo/issue/openclose.tmpl @@ -13,8 +13,10 @@ {{svg "octicon-check" 16 "tw-mr-2"}} {{ctx.Locale.PrettyNumber .ClosedCount}} {{ctx.Locale.Tr "repo.issues.closed_title"}} - - {{svg "octicon-eye" 16 "tw-mr-2"}} - {{ctx.Locale.PrettyNumber (.AllCount)}} {{ctx.Locale.Tr "repo.issues.all_title"}} - + {{if not .PageIsMilestones}} + + {{svg "octicon-eye" 16 "tw-mr-2"}} + {{ctx.Locale.PrettyNumber (.AllCount)}} {{ctx.Locale.Tr "repo.issues.all_title"}} + + {{end}} diff --git a/tests/integration/milestone_test.go b/tests/integration/milestone_test.go index ba46740a19..8e07a0232b 100644 --- a/tests/integration/milestone_test.go +++ b/tests/integration/milestone_test.go @@ -23,3 +23,20 @@ func TestViewMilestones(t *testing.T) { placeholder, _ := search.Attr("placeholder") assert.Equal(t, "Search milestones...", placeholder) } + +func TestMilestonesCount(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + req := NewRequest(t, "GET", "/user2/repo1/milestones") + resp := MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + + openCount := htmlDoc.doc.Find("a[data-test-name='open-issue-count']").Text() + assert.Contains(t, openCount, "2\u00a0Open") + + closedCount := htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Text() + assert.Contains(t, closedCount, "1\u00a0Closed") + + assert.Len(t, htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Nodes, 0) +} From c3cc4d82ec2be23a0769fd7cbb57e4c6e49b83d1 Mon Sep 17 00:00:00 2001 From: JakobDev Date: Mon, 14 Oct 2024 20:15:40 +0200 Subject: [PATCH 02/75] Use assert.Empty --- tests/integration/milestone_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/milestone_test.go b/tests/integration/milestone_test.go index 8e07a0232b..6bcf7d7128 100644 --- a/tests/integration/milestone_test.go +++ b/tests/integration/milestone_test.go @@ -38,5 +38,5 @@ func TestMilestonesCount(t *testing.T) { closedCount := htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Text() assert.Contains(t, closedCount, "1\u00a0Closed") - assert.Len(t, htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Nodes, 0) + assert.Empty(t, htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Nodes) } From 698d7596828a3582cf961fae7f453fff15eea945 Mon Sep 17 00:00:00 2001 From: JakobDev Date: Mon, 14 Oct 2024 22:23:14 +0200 Subject: [PATCH 03/75] Fix test --- tests/integration/milestone_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/milestone_test.go b/tests/integration/milestone_test.go index 6bcf7d7128..2a01786dc0 100644 --- a/tests/integration/milestone_test.go +++ b/tests/integration/milestone_test.go @@ -38,5 +38,5 @@ func TestMilestonesCount(t *testing.T) { closedCount := htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Text() assert.Contains(t, closedCount, "1\u00a0Closed") - assert.Empty(t, htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Nodes) + assert.Empty(t, htmlDoc.doc.Find("a[data-test-name='allissue-count']").Nodes) } From ec4a0e1b6e9c955088750f92819ec2824291d2d2 Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Thu, 24 Oct 2024 15:13:58 +0200 Subject: [PATCH 04/75] fix: reset `history.scrollRestoration` if set to `manual` and no issue anchor in url --- web_src/js/features/repo-issue.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web_src/js/features/repo-issue.js b/web_src/js/features/repo-issue.js index 0b0c1ff9bc..cea817ba01 100644 --- a/web_src/js/features/repo-issue.js +++ b/web_src/js/features/repo-issue.js @@ -481,6 +481,9 @@ export function initRepoPullRequestReview() { }); } } + } else if (window.history.scrollRestoration === 'manual') { + // reset scrollRestoration to 'auto' if there is no hash in url and we set it to 'manual' before + window.history.scrollRestoration = 'auto'; } $(document).on('click', '.show-outdated', function (e) { From 459ab11a8aeb5a4d77cb27561c28eecb11ed0f94 Mon Sep 17 00:00:00 2001 From: Gusted Date: Fri, 25 Oct 2024 18:41:37 +0200 Subject: [PATCH 05/75] fix: use buffered iterate for debian searchpackages - The driver being used for PostgreSQL doesn't handle interleaved queries (you start a query, read some rows and start another query while you didn't finish that query yet), this is the case with using `.Iterate` from XORM. - Switch to a variant of what exist in the current codebase of `db.Iterate`, which is a simple buffered iteration and doesn't keep queries open, which allow other database operations to happen. - Unit test added. This doesn't cover that postgres does not error on this case, as this is not run with a postgres database. - Resolves #5696 --- models/packages/debian/search.go | 45 +++++++++---- models/packages/debian/search_test.go | 93 +++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 models/packages/debian/search_test.go diff --git a/models/packages/debian/search.go b/models/packages/debian/search.go index 77c4a18462..abf23e42f6 100644 --- a/models/packages/debian/search.go +++ b/models/packages/debian/search.go @@ -10,6 +10,7 @@ import ( "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/packages" debian_module "code.gitea.io/gitea/modules/packages/debian" + "code.gitea.io/gitea/modules/setting" "xorm.io/builder" ) @@ -76,25 +77,41 @@ func ExistPackages(ctx context.Context, opts *PackageSearchOptions) (bool, error // SearchPackages gets the packages matching the search options func SearchPackages(ctx context.Context, opts *PackageSearchOptions, iter func(*packages.PackageFileDescriptor)) error { - return db.GetEngine(ctx). - Table("package_file"). - Select("package_file.*"). - Join("INNER", "package_version", "package_version.id = package_file.version_id"). - Join("INNER", "package", "package.id = package_version.package_id"). - Where(opts.toCond()). - Asc("package.lower_name", "package_version.created_unix"). - Iterate(new(packages.PackageFile), func(_ int, bean any) error { - pf := bean.(*packages.PackageFile) + var start int + batchSize := setting.Database.IterateBufferSize + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + beans := make([]*packages.PackageFile, 0, batchSize) - pfd, err := packages.GetPackageFileDescriptor(ctx, pf) - if err != nil { + if err := db.GetEngine(ctx). + Table("package_file"). + Select("package_file.*"). + Join("INNER", "package_version", "package_version.id = package_file.version_id"). + Join("INNER", "package", "package.id = package_version.package_id"). + Where(opts.toCond()). + Asc("package.lower_name", "package_version.created_unix"). + Limit(batchSize, start). + Find(&beans); err != nil { return err } + if len(beans) == 0 { + return nil + } + start += len(beans) - iter(pfd) + for _, bean := range beans { + pfd, err := packages.GetPackageFileDescriptor(ctx, bean) + if err != nil { + return err + } - return nil - }) + iter(pfd) + } + } + } } // GetDistributions gets all available distributions diff --git a/models/packages/debian/search_test.go b/models/packages/debian/search_test.go new file mode 100644 index 0000000000..104a01498b --- /dev/null +++ b/models/packages/debian/search_test.go @@ -0,0 +1,93 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: GPL-3.0-or-later + +package debian + +import ( + "strings" + "testing" + + "code.gitea.io/gitea/models/db" + packages_model "code.gitea.io/gitea/models/packages" + "code.gitea.io/gitea/models/unittest" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/packages" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/test" + packages_service "code.gitea.io/gitea/services/packages" + + _ "code.gitea.io/gitea/models" + _ "code.gitea.io/gitea/models/actions" + _ "code.gitea.io/gitea/models/activities" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestMain(m *testing.M) { + unittest.MainTest(m) +} + +func preparePackage(t *testing.T, owner *user_model.User, name string) { + t.Helper() + + data, err := packages.CreateHashedBufferFromReader(strings.NewReader("data")) + require.NoError(t, err) + + _, _, err = packages_service.CreatePackageOrAddFileToExisting( + db.DefaultContext, + &packages_service.PackageCreationInfo{ + PackageInfo: packages_service.PackageInfo{ + Owner: owner, + PackageType: packages_model.TypeDebian, + Name: name, + }, + Creator: owner, + }, + &packages_service.PackageFileCreationInfo{ + PackageFileInfo: packages_service.PackageFileInfo{ + Filename: name, + }, + Data: data, + Creator: owner, + IsLead: true, + }, + ) + + require.NoError(t, err) +} + +func TestSearchPackages(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + defer test.MockVariableValue(&setting.Database.IterateBufferSize, 1)() + + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) + + preparePackage(t, user2, "debian-1") + preparePackage(t, user2, "debian-2") + preparePackage(t, user3, "debian-1") + + packageFiles := []string{} + require.NoError(t, SearchPackages(db.DefaultContext, &PackageSearchOptions{ + OwnerID: user2.ID, + }, func(pfd *packages_model.PackageFileDescriptor) { + assert.NotNil(t, pfd) + packageFiles = append(packageFiles, pfd.File.Name) + })) + + assert.Len(t, packageFiles, 2) + assert.Contains(t, packageFiles, "debian-1") + assert.Contains(t, packageFiles, "debian-2") + + packageFiles = []string{} + require.NoError(t, SearchPackages(db.DefaultContext, &PackageSearchOptions{ + OwnerID: user3.ID, + }, func(pfd *packages_model.PackageFileDescriptor) { + assert.NotNil(t, pfd) + packageFiles = append(packageFiles, pfd.File.Name) + })) + + assert.Len(t, packageFiles, 1) + assert.Contains(t, packageFiles, "debian-1") +} From 8fdc0a7a6ced463eed481070c782c1bd405c0cfe Mon Sep 17 00:00:00 2001 From: Gusted Date: Fri, 25 Oct 2024 09:24:36 +0200 Subject: [PATCH 06/75] feat: combine review requests comments - Combine review requests comments similairy how labels comments are combined. If review requests comments were made within 60 seconds of each other they will be grouped. - Integration and unit test added. - Resolves #2774 --- models/issues/comment.go | 78 ++-- modules/templates/helper.go | 1 + modules/templates/util_render.go | 12 + options/locale/locale_en-US.ini | 9 +- routers/web/repo/issue.go | 122 +++++ routers/web/repo/issue_test.go | 431 ++++++++++++++++++ .../repo/issue/view_content/comments.tmpl | 42 +- .../TestPullCombinedReviewRequest/review.yml | 21 + tests/integration/pull_test.go | 34 ++ 9 files changed, 685 insertions(+), 65 deletions(-) create mode 100644 tests/integration/fixtures/TestPullCombinedReviewRequest/review.yml diff --git a/models/issues/comment.go b/models/issues/comment.go index d53e5f5949..90c7122174 100644 --- a/models/issues/comment.go +++ b/models/issues/comment.go @@ -222,43 +222,51 @@ func (r RoleInRepo) LocaleHelper(lang translation.Locale) string { return lang.TrString("repo.issues.role." + string(r) + "_helper") } +type RequestReviewTarget interface { + ID() int64 + Name() string + Type() string +} + // Comment represents a comment in commit and issue page. type Comment struct { - ID int64 `xorm:"pk autoincr"` - Type CommentType `xorm:"INDEX"` - PosterID int64 `xorm:"INDEX"` - Poster *user_model.User `xorm:"-"` - OriginalAuthor string - OriginalAuthorID int64 - IssueID int64 `xorm:"INDEX"` - Issue *Issue `xorm:"-"` - LabelID int64 - Label *Label `xorm:"-"` - AddedLabels []*Label `xorm:"-"` - RemovedLabels []*Label `xorm:"-"` - OldProjectID int64 - ProjectID int64 - OldProject *project_model.Project `xorm:"-"` - Project *project_model.Project `xorm:"-"` - OldMilestoneID int64 - MilestoneID int64 - OldMilestone *Milestone `xorm:"-"` - Milestone *Milestone `xorm:"-"` - TimeID int64 - Time *TrackedTime `xorm:"-"` - AssigneeID int64 - RemovedAssignee bool - Assignee *user_model.User `xorm:"-"` - AssigneeTeamID int64 `xorm:"NOT NULL DEFAULT 0"` - AssigneeTeam *organization.Team `xorm:"-"` - ResolveDoerID int64 - ResolveDoer *user_model.User `xorm:"-"` - OldTitle string - NewTitle string - OldRef string - NewRef string - DependentIssueID int64 `xorm:"index"` // This is used by issue_service.deleteIssue - DependentIssue *Issue `xorm:"-"` + ID int64 `xorm:"pk autoincr"` + Type CommentType `xorm:"INDEX"` + PosterID int64 `xorm:"INDEX"` + Poster *user_model.User `xorm:"-"` + OriginalAuthor string + OriginalAuthorID int64 + IssueID int64 `xorm:"INDEX"` + Issue *Issue `xorm:"-"` + LabelID int64 + Label *Label `xorm:"-"` + AddedLabels []*Label `xorm:"-"` + RemovedLabels []*Label `xorm:"-"` + AddedRequestReview []RequestReviewTarget `xorm:"-"` + RemovedRequestReview []RequestReviewTarget `xorm:"-"` + OldProjectID int64 + ProjectID int64 + OldProject *project_model.Project `xorm:"-"` + Project *project_model.Project `xorm:"-"` + OldMilestoneID int64 + MilestoneID int64 + OldMilestone *Milestone `xorm:"-"` + Milestone *Milestone `xorm:"-"` + TimeID int64 + Time *TrackedTime `xorm:"-"` + AssigneeID int64 + RemovedAssignee bool + Assignee *user_model.User `xorm:"-"` + AssigneeTeamID int64 `xorm:"NOT NULL DEFAULT 0"` + AssigneeTeam *organization.Team `xorm:"-"` + ResolveDoerID int64 + ResolveDoer *user_model.User `xorm:"-"` + OldTitle string + NewTitle string + OldRef string + NewRef string + DependentIssueID int64 `xorm:"index"` // This is used by issue_service.deleteIssue + DependentIssue *Issue `xorm:"-"` CommitID int64 Line int64 // - previous line / + proposed line diff --git a/modules/templates/helper.go b/modules/templates/helper.go index aeae8204ad..5b5470b87e 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -182,6 +182,7 @@ func NewFuncMap() template.FuncMap { "RenderMarkdownToHtml": RenderMarkdownToHtml, "RenderLabel": RenderLabel, "RenderLabels": RenderLabels, + "RenderReviewRequest": RenderReviewRequest, // ----------------------------------------------------------------- // misc diff --git a/modules/templates/util_render.go b/modules/templates/util_render.go index c53bdd876f..3c337ae895 100644 --- a/modules/templates/util_render.go +++ b/modules/templates/util_render.go @@ -262,3 +262,15 @@ func RenderLabels(ctx context.Context, locale translation.Locale, labels []*issu htmlCode += "" return template.HTML(htmlCode) } + +func RenderReviewRequest(users []issues_model.RequestReviewTarget) template.HTML { + usernames := make([]string, 0, len(users)) + for _, user := range users { + usernames = append(usernames, template.HTMLEscapeString(user.Name())) + } + + htmlCode := `` + htmlCode += strings.Join(usernames, ", ") + htmlCode += "" + return template.HTML(htmlCode) +} diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index b87fd2a69b..cdfd409d96 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1791,9 +1791,12 @@ issues.review.left_comment = left a comment issues.review.content.empty = You need to leave a comment indicating the requested change(s). issues.review.reject = requested changes %s issues.review.wait = was requested for review %s -issues.review.add_review_request = requested review from %s %s -issues.review.remove_review_request = removed review request for %s %s -issues.review.remove_review_request_self = refused to review %s +issues.review.add_review_request = requested review from %[1]s %[2]s +issues.review.add_review_requests = requested reviews from %[1]s %[2]s +issues.review.remove_review_request = removed review request for %[1]s %[2]s +issues.review.remove_review_requests = removed review requests for %[1]s %[2]s +issues.review.remove_review_request_self = refused to review %[1]s %[2]s +issues.review.add_remove_review_requests = requested reviews from %[1]s and removed review requests for %[2]s %[3]s issues.review.pending = Pending issues.review.pending.tooltip = This comment is not currently visible to other users. To submit your pending comments, select "%s" -> "%s/%s/%s" at the top of the page. issues.review.review = Review diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 2f077572ac..a9351c6a55 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1825,6 +1825,7 @@ func ViewIssue(ctx *context.Context) { // Combine multiple label assignments into a single comment combineLabelComments(issue) + combineRequestReviewComments(issue) getBranchData(ctx, issue) if issue.IsPull { @@ -3665,6 +3666,127 @@ func attachmentsHTML(ctx *context.Context, attachments []*repo_model.Attachment, return attachHTML } +type RequestReviewTarget struct { + user *user_model.User + team *organization.Team +} + +func (t *RequestReviewTarget) ID() int64 { + if t.user != nil { + return t.user.ID + } + return t.team.ID +} + +func (t *RequestReviewTarget) Name() string { + if t.user != nil { + return t.user.GetDisplayName() + } + return t.team.Name +} + +func (t *RequestReviewTarget) Type() string { + if t.user != nil { + return "user" + } + return "team" +} + +// combineRequestReviewComments combine the nearby request review comments as one. +func combineRequestReviewComments(issue *issues_model.Issue) { + var prev, cur *issues_model.Comment + for i := 0; i < len(issue.Comments); i++ { + cur = issue.Comments[i] + if i > 0 { + prev = issue.Comments[i-1] + } + if i == 0 || cur.Type != issues_model.CommentTypeReviewRequest || + (prev != nil && prev.PosterID != cur.PosterID) || + (prev != nil && cur.CreatedUnix-prev.CreatedUnix >= 60) { + if cur.Type == issues_model.CommentTypeReviewRequest && (cur.Assignee != nil || cur.AssigneeTeam != nil) { + if cur.RemovedAssignee { + if cur.AssigneeTeam != nil { + cur.RemovedRequestReview = append(cur.RemovedRequestReview, &RequestReviewTarget{team: cur.AssigneeTeam}) + } else { + cur.RemovedRequestReview = append(cur.RemovedRequestReview, &RequestReviewTarget{user: cur.Assignee}) + } + } else { + if cur.AssigneeTeam != nil { + cur.AddedRequestReview = append(cur.AddedRequestReview, &RequestReviewTarget{team: cur.AssigneeTeam}) + } else { + cur.AddedRequestReview = append(cur.AddedRequestReview, &RequestReviewTarget{user: cur.Assignee}) + } + } + } + continue + } + + // Previous comment is not a review request, so cannot group. Start a new group. + if prev.Type != issues_model.CommentTypeReviewRequest { + if cur.RemovedAssignee { + if cur.AssigneeTeam != nil { + cur.RemovedRequestReview = append(cur.RemovedRequestReview, &RequestReviewTarget{team: cur.AssigneeTeam}) + } else { + cur.RemovedRequestReview = append(cur.RemovedRequestReview, &RequestReviewTarget{user: cur.Assignee}) + } + } else { + if cur.AssigneeTeam != nil { + cur.AddedRequestReview = append(cur.AddedRequestReview, &RequestReviewTarget{team: cur.AssigneeTeam}) + } else { + cur.AddedRequestReview = append(cur.AddedRequestReview, &RequestReviewTarget{user: cur.Assignee}) + } + } + continue + } + + // Start grouping. + if cur.RemovedAssignee { + addedIndex := slices.IndexFunc(prev.AddedRequestReview, func(t issues_model.RequestReviewTarget) bool { + if cur.AssigneeTeam != nil { + return cur.AssigneeTeam.ID == t.ID() && t.Type() == "team" + } + return cur.Assignee.ID == t.ID() && t.Type() == "user" + }) + + // If for this target a AddedRequestReview, then we remove that entry. If it's not found, then add it to the RemovedRequestReview. + if addedIndex == -1 { + if cur.AssigneeTeam != nil { + prev.RemovedRequestReview = append(prev.RemovedRequestReview, &RequestReviewTarget{team: cur.AssigneeTeam}) + } else { + prev.RemovedRequestReview = append(prev.RemovedRequestReview, &RequestReviewTarget{user: cur.Assignee}) + } + } else { + prev.AddedRequestReview = slices.Delete(prev.AddedRequestReview, addedIndex, addedIndex+1) + } + } else { + removedIndex := slices.IndexFunc(prev.RemovedRequestReview, func(t issues_model.RequestReviewTarget) bool { + if cur.AssigneeTeam != nil { + return cur.AssigneeTeam.ID == t.ID() && t.Type() == "team" + } + return cur.Assignee.ID == t.ID() && t.Type() == "user" + }) + + // If for this target a RemovedRequestReview, then we remove that entry. If it's not found, then add it to the AddedRequestReview. + if removedIndex == -1 { + if cur.AssigneeTeam != nil { + prev.AddedRequestReview = append(prev.AddedRequestReview, &RequestReviewTarget{team: cur.AssigneeTeam}) + } else { + prev.AddedRequestReview = append(prev.AddedRequestReview, &RequestReviewTarget{user: cur.Assignee}) + } + } else { + prev.RemovedRequestReview = slices.Delete(prev.RemovedRequestReview, removedIndex, removedIndex+1) + } + } + + // Propoagate creation time. + prev.CreatedUnix = cur.CreatedUnix + + // Remove the current comment since it has been combined to prev comment + issue.Comments = append(issue.Comments[:i], issue.Comments[i+1:]...) + i-- + } +} + // combineLabelComments combine the nearby label comments as one. func combineLabelComments(issue *issues_model.Issue) { var prev, cur *issues_model.Comment diff --git a/routers/web/repo/issue_test.go b/routers/web/repo/issue_test.go index f1d0aac72f..d642c14b5f 100644 --- a/routers/web/repo/issue_test.go +++ b/routers/web/repo/issue_test.go @@ -7,6 +7,8 @@ import ( "testing" issues_model "code.gitea.io/gitea/models/issues" + org_model "code.gitea.io/gitea/models/organization" + user_model "code.gitea.io/gitea/models/user" "github.com/stretchr/testify/assert" ) @@ -373,3 +375,432 @@ func TestCombineLabelComments(t *testing.T) { }) } } + +func TestCombineReviewRequests(t *testing.T) { + testCases := []struct { + name string + beforeCombined []*issues_model.Comment + afterCombined []*issues_model.Comment + }{ + { + name: "case 1", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + RemovedAssignee: true, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + CreatedUnix: 0, + AddedRequestReview: []issues_model.RequestReviewTarget{}, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + }, + }, + { + name: "case 2", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + Assignee: &user_model.User{ + ID: 2, + Name: "Ghost 2", + }, + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + CreatedUnix: 0, + AddedRequestReview: []issues_model.RequestReviewTarget{ + &RequestReviewTarget{ + user: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + &RequestReviewTarget{ + user: &user_model.User{ + ID: 2, + Name: "Ghost 2", + }, + }, + }, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + }, + }, + { + name: "case 3", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + RemovedAssignee: true, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + CreatedUnix: 0, + AddedRequestReview: []issues_model.RequestReviewTarget{ + &RequestReviewTarget{ + user: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + }, + RemovedRequestReview: []issues_model.RequestReviewTarget{ + &RequestReviewTarget{ + team: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + }, + }, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + }, + }, + { + name: "case 4", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + RemovedAssignee: true, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + CreatedUnix: 0, + AddedRequestReview: []issues_model.RequestReviewTarget{ + &RequestReviewTarget{ + user: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + }, + RemovedRequestReview: []issues_model.RequestReviewTarget{}, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + }, + }, + { + name: "case 5", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + RemovedAssignee: true, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + RemovedAssignee: true, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + CreatedUnix: 0, + AddedRequestReview: []issues_model.RequestReviewTarget{}, + RemovedRequestReview: []issues_model.RequestReviewTarget{}, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + }, + }, + { + name: "case 6", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + RemovedAssignee: true, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + RemovedAssignee: true, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + CreatedUnix: 0, + RemovedRequestReview: []issues_model.RequestReviewTarget{&RequestReviewTarget{ + team: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + }}, + AddedRequestReview: []issues_model.RequestReviewTarget{&RequestReviewTarget{ + user: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }}, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + { + Type: issues_model.CommentTypeComment, + PosterID: 1, + Content: "test", + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + CreatedUnix: 0, + AddedRequestReview: []issues_model.RequestReviewTarget{&RequestReviewTarget{ + team: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + }}, + RemovedRequestReview: []issues_model.RequestReviewTarget{&RequestReviewTarget{ + user: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }}, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + }, + }, + }, + { + name: "case 7", + beforeCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + CreatedUnix: 0, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + CreatedUnix: 61, + }, + }, + afterCombined: []*issues_model.Comment{ + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + CreatedUnix: 0, + AddedRequestReview: []issues_model.RequestReviewTarget{&RequestReviewTarget{ + user: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }}, + Assignee: &user_model.User{ + ID: 1, + Name: "Ghost", + }, + }, + { + Type: issues_model.CommentTypeReviewRequest, + PosterID: 1, + CreatedUnix: 0, + RemovedRequestReview: []issues_model.RequestReviewTarget{&RequestReviewTarget{ + team: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + }}, + AssigneeTeam: &org_model.Team{ + ID: 1, + Name: "Team 1", + }, + }, + }, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + issue := issues_model.Issue{ + Comments: testCase.beforeCombined, + } + combineRequestReviewComments(&issue) + assert.EqualValues(t, testCase.afterCombined[0], issue.Comments[0]) + }) + } +} diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 08c83c07d7..78fa854dbe 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -522,35 +522,23 @@ {{else if eq .Type 27}} -
- {{svg "octicon-eye"}} - {{template "shared/user/avatarlink" dict "user" .Poster}} - - {{template "shared/user/authorlink" .Poster}} - {{if (gt .AssigneeID 0)}} - {{if .RemovedAssignee}} - {{if eq .PosterID .AssigneeID}} - {{ctx.Locale.Tr "repo.issues.review.remove_review_request_self" $createdStr}} - {{else}} - {{ctx.Locale.Tr "repo.issues.review.remove_review_request" .Assignee.GetDisplayName $createdStr}} - {{end}} + {{if or .AddedRequestReview .RemovedRequestReview}} +
+ {{svg "octicon-tag"}} + {{template "shared/user/avatarlink" dict "user" .Poster}} + + {{if and (eq (len .RemovedRequestReview) 1) (eq (len .AddedRequestReview) 0) (eq ((index .RemovedRequestReview 0).ID) .PosterID) (eq ((index .RemovedRequestReview 0).Type) "user")}} + {{ctx.Locale.Tr "repo.issues.review.remove_review_request_self" $createdStr}} + {{else if and .AddedRequestReview (not .RemovedRequestReview)}} + {{ctx.Locale.TrN (len .AddedRequestReview) "repo.issues.review.add_review_request" "repo.issues.review.add_review_requests" (RenderReviewRequest .AddedRequestReview) $createdStr}} + {{else if and (not .AddedRequestReview) .RemovedRequestReview}} + {{ctx.Locale.TrN (len .RemovedRequestReview) "repo.issues.review.remove_review_request" "repo.issues.review.remove_review_requests" (RenderReviewRequest .RemovedRequestReview) $createdStr}} {{else}} - {{ctx.Locale.Tr "repo.issues.review.add_review_request" .Assignee.GetDisplayName $createdStr}} + {{ctx.Locale.Tr "repo.issues.review.add_remove_review_requests" (RenderReviewRequest .AddedRequestReview) (RenderReviewRequest .RemovedRequestReview) $createdStr}} {{end}} - {{else}} - - {{$teamName := "Ghost Team"}} - {{if .AssigneeTeam}} - {{$teamName = .AssigneeTeam.Name}} - {{end}} - {{if .RemovedAssignee}} - {{ctx.Locale.Tr "repo.issues.review.remove_review_request" $teamName $createdStr}} - {{else}} - {{ctx.Locale.Tr "repo.issues.review.add_review_request" $teamName $createdStr}} - {{end}} - {{end}} - -
+
+
+ {{end}} {{else if and (eq .Type 29) (or (gt .CommitsNum 0) .IsForcePush)}} {{if and .Issue.IsClosed (gt .ID $.LatestCloseCommentID)}} diff --git a/tests/integration/fixtures/TestPullCombinedReviewRequest/review.yml b/tests/integration/fixtures/TestPullCombinedReviewRequest/review.yml new file mode 100644 index 0000000000..deea4492e9 --- /dev/null +++ b/tests/integration/fixtures/TestPullCombinedReviewRequest/review.yml @@ -0,0 +1,21 @@ +- + id: 1001 + type: 4 + reviewer_id: 2 + issue_id: 3 + official: true + stale: false + original_author_id: 0 + updated_unix: 1000000000 + created_unix: 1000000000 + +- + id: 1002 + type: 4 + reviewer_id: 11 + issue_id: 3 + official: true + stale: false + original_author_id: 0 + updated_unix: 1000000000 + created_unix: 1000000000 diff --git a/tests/integration/pull_test.go b/tests/integration/pull_test.go index 10dbad2228..8f951f05ab 100644 --- a/tests/integration/pull_test.go +++ b/tests/integration/pull_test.go @@ -65,3 +65,37 @@ func TestPullManuallyMergeWarning(t *testing.T) { assert.NotContains(t, mergeInstructions, warningMessage) }) } + +func TestPullCombinedReviewRequest(t *testing.T) { + defer tests.AddFixtures("tests/integration/fixtures/TestPullCombinedReviewRequest/")() + defer tests.PrepareTestEnv(t)() + + session := loginUser(t, "user2") + + helper := func(t *testing.T, action, userID, expectedText string) { + t.Helper() + + req := NewRequestWithValues(t, "POST", "/user2/repo1/pulls/request_review", map[string]string{ + "_csrf": GetCSRF(t, session, "/user2/repo1/pulls/3"), + "issue_ids": "3", + "action": action, + "id": userID, + }) + session.MakeRequest(t, req, http.StatusOK) + + req = NewRequest(t, "GET", "/user2/repo1/pulls/3") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + assert.Contains(t, htmlDoc.Find(".timeline-item:has(.review-request-list)").Last().Text(), expectedText) + } + + helper(t, "detach", "2", "refused to review") + helper(t, "attach", "4", "requested reviews from user4 and removed review requests for user2") + helper(t, "attach", "9", "requested reviews from user4, user9 and removed review requests for user2") + helper(t, "attach", "2", "requested reviews from user4, user9") + helper(t, "detach", "4", "requested review from user9") + helper(t, "detach", "11", "requested reviews from user9 and removed review requests for user11") + helper(t, "detach", "9", "removed review request for user11") + helper(t, "detach", "2", "removed review requests for user11, user2") +} From c9cb4700340797bb15a27dfd5261e440afe21f5a Mon Sep 17 00:00:00 2001 From: wangjingcun Date: Tue, 22 Oct 2024 08:41:05 +0800 Subject: [PATCH 07/75] chore: fix some function names in comment (#32300) fix some function names in comment (cherry picked from commit 3d6ccbac3f20c485ab95a29d280c9371e558bfac) --- cmd/admin_auth_ldap.go | 2 +- models/issues/issue.go | 2 +- models/issues/pull.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/admin_auth_ldap.go b/cmd/admin_auth_ldap.go index e3c81809f8..aff2a12855 100644 --- a/cmd/admin_auth_ldap.go +++ b/cmd/admin_auth_ldap.go @@ -386,7 +386,7 @@ func (a *authService) addLdapSimpleAuth(c *cli.Context) error { return a.createAuthSource(ctx, authSource) } -// updateLdapBindDn updates a new LDAP (simple auth) authentication source. +// updateLdapSimpleAuth updates a new LDAP (simple auth) authentication source. func (a *authService) updateLdapSimpleAuth(c *cli.Context) error { ctx, cancel := installSignals() defer cancel() diff --git a/models/issues/issue.go b/models/issues/issue.go index f7379b7e0c..13991da767 100644 --- a/models/issues/issue.go +++ b/models/issues/issue.go @@ -875,7 +875,7 @@ func GetPinnedIssues(ctx context.Context, repoID int64, isPull bool) (IssueList, return issues, nil } -// IsNewPinnedAllowed returns if a new Issue or Pull request can be pinned +// IsNewPinAllowed returns if a new Issue or Pull request can be pinned func IsNewPinAllowed(ctx context.Context, repoID int64, isPull bool) (bool, error) { var maxPin int _, err := db.GetEngine(ctx).SQL("SELECT COUNT(pin_order) FROM issue WHERE repo_id = ? AND is_pull = ? AND pin_order > 0", repoID, isPull).Get(&maxPin) diff --git a/models/issues/pull.go b/models/issues/pull.go index 45e2e19434..e7663ea350 100644 --- a/models/issues/pull.go +++ b/models/issues/pull.go @@ -689,7 +689,7 @@ func GetPullRequestByIssueID(ctx context.Context, issueID int64) (*PullRequest, return pr, pr.LoadAttributes(ctx) } -// GetPullRequestsByBaseHeadInfo returns the pull request by given base and head +// GetPullRequestByBaseHeadInfo returns the pull request by given base and head func GetPullRequestByBaseHeadInfo(ctx context.Context, baseID, headID int64, base, head string) (*PullRequest, error) { pr := &PullRequest{} sess := db.GetEngine(ctx). From 00379db370a06ae4c8186bb5840fb03214523705 Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Sun, 27 Oct 2024 09:39:18 +0000 Subject: [PATCH 08/75] i18n: fix placeholders in string for refusing to review (#5713) Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/5713 Reviewed-by: Earl Warren --- options/locale/locale_en-US.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index cdfd409d96..113c94d71f 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1795,7 +1795,7 @@ issues.review.add_review_request = requested review from %[1]s %[2]s issues.review.add_review_requests = requested reviews from %[1]s %[2]s issues.review.remove_review_request = removed review request for %[1]s %[2]s issues.review.remove_review_requests = removed review requests for %[1]s %[2]s -issues.review.remove_review_request_self = refused to review %[1]s %[2]s +issues.review.remove_review_request_self = refused to review %s issues.review.add_remove_review_requests = requested reviews from %[1]s and removed review requests for %[2]s %[3]s issues.review.pending = Pending issues.review.pending.tooltip = This comment is not currently visible to other users. To submit your pending comments, select "%s" -> "%s/%s/%s" at the top of the page. From 8c79008d6ff055df643a43cd6f9edbe220d87c35 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 22 Oct 2024 13:09:19 +0800 Subject: [PATCH 09/75] Add `DISABLE_ORGANIZATIONS_PAGE` and `DISABLE_CODE_PAGE` settings for explore pages and fix an issue related to user search (#32288) These settings can allow users to only display the repositories explore page. Thanks to yp05327 and wxiaoguang ! --------- Co-authored-by: Giteabot Co-authored-by: wxiaoguang (cherry picked from commit 9206fbb55fd28f21720072fce6a36cc22277934c) Conflicts: - templates/explore/navbar.tmpl Resolved by manually applying the last hunk to our template. --- custom/conf/app.example.ini | 18 +++++++++++++ modules/setting/service.go | 6 +++-- routers/api/v1/api.go | 12 +++++++-- routers/web/explore/code.go | 5 ++-- routers/web/explore/org.go | 8 +++++- routers/web/explore/repo.go | 4 ++- routers/web/explore/user.go | 4 ++- routers/web/user/search.go | 31 +++++++---------------- routers/web/web.go | 2 +- templates/explore/navbar.tmpl | 7 +++-- web_src/js/features/comp/SearchUserBox.js | 27 +++++++++----------- 11 files changed, 75 insertions(+), 49 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 24a1ccc6f4..3f0e9c447d 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -925,6 +925,24 @@ LEVEL = Info ;; Valid site url schemes for user profiles ;VALID_SITE_URL_SCHEMES=http,https +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;[service.explore] +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Only allow signed in users to view the explore pages. +;REQUIRE_SIGNIN_VIEW = false +;; +;; Disable the users explore page. +;DISABLE_USERS_PAGE = false +;; +;; Disable the organizations explore page. +;DISABLE_ORGANIZATIONS_PAGE = false +;; +;; Disable the code explore page. +;DISABLE_CODE_PAGE = false +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/modules/setting/service.go b/modules/setting/service.go index afaee18101..128b8c7069 100644 --- a/modules/setting/service.go +++ b/modules/setting/service.go @@ -91,8 +91,10 @@ var Service = struct { // Explore page settings Explore struct { - RequireSigninView bool `ini:"REQUIRE_SIGNIN_VIEW"` - DisableUsersPage bool `ini:"DISABLE_USERS_PAGE"` + RequireSigninView bool `ini:"REQUIRE_SIGNIN_VIEW"` + DisableUsersPage bool `ini:"DISABLE_USERS_PAGE"` + DisableOrganizationsPage bool `ini:"DISABLE_ORGANIZATIONS_PAGE"` + DisableCodePage bool `ini:"DISABLE_CODE_PAGE"` } `ini:"service.explore"` }{ AllowedUserVisibilityModesSlice: []bool{true, true, true}, diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 6e4a97b885..b8f49a5bb6 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -395,12 +395,20 @@ func reqToken() func(ctx *context.APIContext) { func reqExploreSignIn() func(ctx *context.APIContext) { return func(ctx *context.APIContext) { - if setting.Service.Explore.RequireSigninView && !ctx.IsSigned { + if (setting.Service.RequireSignInView || setting.Service.Explore.RequireSigninView) && !ctx.IsSigned { ctx.Error(http.StatusUnauthorized, "reqExploreSignIn", "you must be signed in to search for users") } } } +func reqUsersExploreEnabled() func(ctx *context.APIContext) { + return func(ctx *context.APIContext) { + if setting.Service.Explore.DisableUsersPage { + ctx.NotFound() + } + } +} + func reqBasicOrRevProxyAuth() func(ctx *context.APIContext) { return func(ctx *context.APIContext) { if ctx.IsSigned && setting.Service.EnableReverseProxyAuthAPI && ctx.Data["AuthedMethod"].(string) == auth.ReverseProxyMethodName { @@ -887,7 +895,7 @@ func Routes() *web.Route { // Users (requires user scope) m.Group("/users", func() { - m.Get("/search", reqExploreSignIn(), user.Search) + m.Get("/search", reqExploreSignIn(), reqUsersExploreEnabled(), user.Search) m.Group("/{username}", func() { m.Get("", reqExploreSignIn(), user.GetInfo) diff --git a/routers/web/explore/code.go b/routers/web/explore/code.go index 437282cbb1..7992517ad4 100644 --- a/routers/web/explore/code.go +++ b/routers/web/explore/code.go @@ -21,12 +21,13 @@ const ( // Code render explore code page func Code(ctx *context.Context) { - if !setting.Indexer.RepoIndexerEnabled { + if !setting.Indexer.RepoIndexerEnabled || setting.Service.Explore.DisableCodePage { ctx.Redirect(setting.AppSubURL + "/explore") return } - ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage + ctx.Data["UsersPageIsDisabled"] = setting.Service.Explore.DisableUsersPage + ctx.Data["OrganizationsPageIsDisabled"] = setting.Service.Explore.DisableOrganizationsPage ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled ctx.Data["Title"] = ctx.Tr("explore") ctx.Data["PageIsExplore"] = true diff --git a/routers/web/explore/org.go b/routers/web/explore/org.go index f8fd6ec38e..7178630b64 100644 --- a/routers/web/explore/org.go +++ b/routers/web/explore/org.go @@ -14,7 +14,13 @@ import ( // Organizations render explore organizations page func Organizations(ctx *context.Context) { - ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage + if setting.Service.Explore.DisableOrganizationsPage { + ctx.Redirect(setting.AppSubURL + "/explore") + return + } + + ctx.Data["UsersPageIsDisabled"] = setting.Service.Explore.DisableUsersPage + ctx.Data["CodePageIsDisabled"] = setting.Service.Explore.DisableCodePage ctx.Data["Title"] = ctx.Tr("explore") ctx.Data["PageIsExplore"] = true ctx.Data["PageIsExploreOrganizations"] = true diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go index 116b983b3a..798fdf5654 100644 --- a/routers/web/explore/repo.go +++ b/routers/web/explore/repo.go @@ -165,7 +165,9 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { // Repos render explore repositories page func Repos(ctx *context.Context) { - ctx.Data["UsersIsDisabled"] = setting.Service.Explore.DisableUsersPage + ctx.Data["UsersPageIsDisabled"] = setting.Service.Explore.DisableUsersPage + ctx.Data["OrganizationsPageIsDisabled"] = setting.Service.Explore.DisableOrganizationsPage + ctx.Data["CodePageIsDisabled"] = setting.Service.Explore.DisableCodePage ctx.Data["Title"] = ctx.Tr("explore") ctx.Data["PageIsExplore"] = true ctx.Data["PageIsExploreRepositories"] = true diff --git a/routers/web/explore/user.go b/routers/web/explore/user.go index b79a79fb2c..15c60f546f 100644 --- a/routers/web/explore/user.go +++ b/routers/web/explore/user.go @@ -131,9 +131,11 @@ func RenderUserSearch(ctx *context.Context, opts *user_model.SearchUserOptions, // Users render explore users page func Users(ctx *context.Context) { if setting.Service.Explore.DisableUsersPage { - ctx.Redirect(setting.AppSubURL + "/explore/repos") + ctx.Redirect(setting.AppSubURL + "/explore") return } + ctx.Data["OrganizationsPageIsDisabled"] = setting.Service.Explore.DisableOrganizationsPage + ctx.Data["CodePageIsDisabled"] = setting.Service.Explore.DisableCodePage ctx.Data["Title"] = ctx.Tr("explore") ctx.Data["PageIsExplore"] = true ctx.Data["PageIsExploreUsers"] = true diff --git a/routers/web/user/search.go b/routers/web/user/search.go index fb7729bbe1..be5eee90a9 100644 --- a/routers/web/user/search.go +++ b/routers/web/user/search.go @@ -8,37 +8,24 @@ import ( "code.gitea.io/gitea/models/db" user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/convert" ) -// Search search users -func Search(ctx *context.Context) { - listOptions := db.ListOptions{ - Page: ctx.FormInt("page"), - PageSize: convert.ToCorrectPageSize(ctx.FormInt("limit")), - } - - users, maxResults, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ +// SearchCandidates searches candidate users for dropdown list +func SearchCandidates(ctx *context.Context) { + users, _, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ Actor: ctx.Doer, Keyword: ctx.FormTrim("q"), - UID: ctx.FormInt64("uid"), Type: user_model.UserTypeIndividual, - IsActive: ctx.FormOptionalBool("active"), - ListOptions: listOptions, + IsActive: optional.Some(true), + ListOptions: db.ListOptions{PageSize: setting.UI.MembersPagingNum}, }) if err != nil { - ctx.JSON(http.StatusInternalServerError, map[string]any{ - "ok": false, - "error": err.Error(), - }) + ctx.ServerError("Unable to search users", err) return } - - ctx.SetTotalCountHeader(maxResults) - - ctx.JSON(http.StatusOK, map[string]any{ - "ok": true, - "data": convert.ToUsers(ctx, ctx.Doer, users), - }) + ctx.JSON(http.StatusOK, map[string]any{"data": convert.ToUsers(ctx, ctx.Doer, users)}) } diff --git a/routers/web/web.go b/routers/web/web.go index c268f7224d..34880bdda1 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -642,7 +642,7 @@ func registerRoutes(m *web.Route) { m.Post("/logout", auth.SignOut) m.Get("/task/{task}", reqSignIn, user.TaskStatus) m.Get("/stopwatches", reqSignIn, user.GetStopwatches) - m.Get("/search", ignExploreSignIn, user.Search) + m.Get("/search_candidates", ignExploreSignIn, user.SearchCandidates) m.Group("/oauth2", func() { m.Get("/{provider}", auth.SignInOAuth) m.Get("/{provider}/callback", auth.SignInOAuthCallback) diff --git a/templates/explore/navbar.tmpl b/templates/explore/navbar.tmpl index 8e619fa66f..c07c0ba4a4 100644 --- a/templates/explore/navbar.tmpl +++ b/templates/explore/navbar.tmpl @@ -3,15 +3,18 @@ {{svg "octicon-repo"}} {{ctx.Locale.Tr "explore.repos"}} - {{if not .UsersIsDisabled}} + {{if not .UsersPageIsDisabled}} {{svg "octicon-person"}} {{ctx.Locale.Tr "explore.users"}} {{end}} + {{if not .OrganizationsPageIsDisabled}} {{svg "octicon-organization"}} {{ctx.Locale.Tr "explore.organizations"}} - {{if and (not $.UnitTypeCode.UnitGlobalDisabled) .IsRepoIndexerEnabled}} + {{end}} + + {{if and (not $.UnitTypeCode.UnitGlobalDisabled) .IsRepoIndexerEnabled (not .CodePageIsDisabled)}} {{svg "octicon-code"}} {{ctx.Locale.Tr "explore.code"}} diff --git a/web_src/js/features/comp/SearchUserBox.js b/web_src/js/features/comp/SearchUserBox.js index 081c47425f..b03cbad16f 100644 --- a/web_src/js/features/comp/SearchUserBox.js +++ b/web_src/js/features/comp/SearchUserBox.js @@ -8,41 +8,38 @@ export function initCompSearchUserBox() { const searchUserBox = document.getElementById('search-user-box'); if (!searchUserBox) return; - const $searchUserBox = $(searchUserBox); const allowEmailInput = searchUserBox.getAttribute('data-allow-email') === 'true'; const allowEmailDescription = searchUserBox.getAttribute('data-allow-email-description') ?? undefined; - $searchUserBox.search({ + $(searchUserBox).search({ minCharacters: 2, apiSettings: { - url: `${appSubUrl}/user/search?active=1&q={query}`, + url: `${appSubUrl}/user/search_candidates?q={query}`, onResponse(response) { - const items = []; - const searchQuery = $searchUserBox.find('input').val(); + const resultItems = []; + const searchQuery = searchUserBox.querySelector('input').value; const searchQueryUppercase = searchQuery.toUpperCase(); - $.each(response.data, (_i, item) => { + for (const item of response.data) { const resultItem = { title: item.login, image: item.avatar_url, + description: htmlEscape(item.full_name), }; - if (item.full_name) { - resultItem.description = htmlEscape(item.full_name); - } if (searchQueryUppercase === item.login.toUpperCase()) { - items.unshift(resultItem); + resultItems.unshift(resultItem); // add the exact match to the top } else { - items.push(resultItem); + resultItems.push(resultItem); } - }); + } - if (allowEmailInput && !items.length && looksLikeEmailAddressCheck.test(searchQuery)) { + if (allowEmailInput && !resultItems.length && looksLikeEmailAddressCheck.test(searchQuery)) { const resultItem = { title: searchQuery, description: allowEmailDescription, }; - items.push(resultItem); + resultItems.push(resultItem); } - return {results: items}; + return {results: resultItems}; }, }, searchFields: ['login', 'full_name'], From 261c0a95b4f67296dccb700b946f213807213ea2 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 23 Oct 2024 09:28:28 +0800 Subject: [PATCH 10/75] Add warn log when deleting inactive users (#32318) Add log for the problem #31480 (cherry picked from commit a264c46fb04112c5ec2c1b2acd523a2e4450da40) Conflicts: - services/user/user.go Resolved by manually adding the log line. --- services/user/user.go | 1 + 1 file changed, 1 insertion(+) diff --git a/services/user/user.go b/services/user/user.go index 606a4b2137..817c46e059 100644 --- a/services/user/user.go +++ b/services/user/user.go @@ -306,6 +306,7 @@ func DeleteInactiveUsers(ctx context.Context, olderThan time.Duration) error { // Ignore users that were set inactive by admin. if models.IsErrUserOwnRepos(err) || models.IsErrUserHasOrgs(err) || models.IsErrUserOwnPackages(err) || models.IsErrDeleteLastAdminUser(err) { + log.Warn("Inactive user %q has repositories, organizations or packages, skipping deletion: %v", u.Name, err) continue } return err From 480d565944be2bd4aa91462f8ef98b3afafe14eb Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 23 Oct 2024 14:41:00 +0800 Subject: [PATCH 11/75] Fix disable 2fa bug (#32320) (cherry picked from commit 2abdbe88b5d16dcb345d27b73f1d9738f2d826dd) --- routers/web/user/setting/security/2fa.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/routers/web/user/setting/security/2fa.go b/routers/web/user/setting/security/2fa.go index a145867ea4..7c85c0e4b7 100644 --- a/routers/web/user/setting/security/2fa.go +++ b/routers/web/user/setting/security/2fa.go @@ -34,8 +34,9 @@ func RegenerateScratchTwoFactor(ctx *context.Context) { if auth.IsErrTwoFactorNotEnrolled(err) { ctx.Flash.Error(ctx.Tr("settings.twofa_not_enrolled")) ctx.Redirect(setting.AppSubURL + "/user/settings/security") + } else { + ctx.ServerError("SettingsTwoFactor: Failed to GetTwoFactorByUID", err) } - ctx.ServerError("SettingsTwoFactor: Failed to GetTwoFactorByUID", err) return } @@ -64,8 +65,9 @@ func DisableTwoFactor(ctx *context.Context) { if auth.IsErrTwoFactorNotEnrolled(err) { ctx.Flash.Error(ctx.Tr("settings.twofa_not_enrolled")) ctx.Redirect(setting.AppSubURL + "/user/settings/security") + } else { + ctx.ServerError("SettingsTwoFactor: Failed to GetTwoFactorByUID", err) } - ctx.ServerError("SettingsTwoFactor: Failed to GetTwoFactorByUID", err) return } @@ -74,8 +76,9 @@ func DisableTwoFactor(ctx *context.Context) { // There is a potential DB race here - we must have been disabled by another request in the intervening period ctx.Flash.Success(ctx.Tr("settings.twofa_disabled")) ctx.Redirect(setting.AppSubURL + "/user/settings/security") + } else { + ctx.ServerError("SettingsTwoFactor: Failed to DeleteTwoFactorByID", err) } - ctx.ServerError("SettingsTwoFactor: Failed to DeleteTwoFactorByID", err) return } From 83e4139d410f3f9ca46e65ba808c03b37f366bfe Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Sun, 27 Oct 2024 11:00:20 +0100 Subject: [PATCH 12/75] chore(release-notes): notes for the week 2024-44 weekly cherry pick --- release-notes/5714.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 release-notes/5714.md diff --git a/release-notes/5714.md b/release-notes/5714.md new file mode 100644 index 0000000000..968ad8bb51 --- /dev/null +++ b/release-notes/5714.md @@ -0,0 +1,3 @@ +fix: [commit](https://codeberg.org/forgejo/forgejo/commit/d13a4ab5632d6a9697bd0907f9c69ed57d949340) Fixed a bug related to disabling two-factor authentication +chore: [commit](https://codeberg.org/forgejo/forgejo/commit/ab26d880932dbc116c43ea277029984c7a6d4e94) Emit a log message when failing to delete an inactive user +feat: [commit](https://codeberg.org/forgejo/forgejo/commit/ab660c5944d59cdb4ecc071401445ac9f53cee45) Add `DISABLE_ORGANIZATIONS_PAGE` and `DISABLE_CODE_PAGE` settings for explore pages From 492c667a6ffb119a2d024a09c489ad99b7a5fc7f Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 28 Oct 2024 00:06:32 +0000 Subject: [PATCH 13/75] Lock file maintenance --- package-lock.json | 1769 +++++++++++++--------------- web_src/fomantic/package-lock.json | 32 +- 2 files changed, 823 insertions(+), 978 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa09af59f0..2841e704f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -172,12 +172,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", + "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -185,9 +186,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", - "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz", + "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==", "dev": true, "license": "MIT", "engines": { @@ -275,13 +276,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz", + "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7", + "@babel/parser": "^7.26.0", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -291,41 +293,41 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", - "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", - "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -345,18 +347,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", - "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-member-expression-to-functions": "^7.25.7", - "@babel/helper-optimise-call-expression": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/traverse": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -377,13 +379,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", - "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, @@ -422,44 +424,43 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", - "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -469,22 +470,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", - "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, "license": "MIT", "engines": { @@ -492,15 +493,15 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", - "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-wrap-function": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -510,15 +511,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", - "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.7", - "@babel/helper-optimise-call-expression": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -528,55 +529,55 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", - "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "license": "MIT", "engines": { @@ -584,127 +585,41 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", - "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz", + "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.8" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -714,14 +629,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", - "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -731,13 +646,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", - "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -747,13 +662,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", - "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -763,15 +678,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", - "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -781,14 +696,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", - "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -871,13 +786,13 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.7.tgz", - "integrity": "sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -913,13 +828,13 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.25.7.tgz", - "integrity": "sha512-fyoj6/YdVtlv2ROig/J0fP7hh/wNO1MJGm1NR70Pg7jbkF+jOUL9joorqaCOQh06Y+LfgTagHzC8KqZ3MF782w==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -929,13 +844,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", - "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -945,13 +860,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", - "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -987,13 +902,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", - "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1130,13 +1045,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", - "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1146,15 +1061,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", - "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1164,15 +1079,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", - "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1182,13 +1097,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", - "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1198,13 +1113,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", - "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1214,14 +1129,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", - "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1231,14 +1146,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", - "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1248,17 +1163,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", - "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7", - "@babel/traverse": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -1279,14 +1194,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", - "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/template": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1296,13 +1211,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", - "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1312,14 +1227,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", - "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1329,13 +1244,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", - "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1345,14 +1260,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1362,13 +1277,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", - "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1378,14 +1293,14 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", - "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1395,13 +1310,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", - "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1411,14 +1326,14 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.7.tgz", - "integrity": "sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", + "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-flow": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-flow": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1428,14 +1343,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", - "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1445,15 +1360,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", - "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1463,13 +1378,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", - "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1479,13 +1394,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", - "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1495,13 +1410,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", - "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1511,13 +1426,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", - "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1527,14 +1442,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", - "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1544,15 +1459,15 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", - "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1562,16 +1477,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", - "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1581,14 +1496,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", - "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1598,14 +1513,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1615,13 +1530,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", - "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1631,13 +1546,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", - "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1647,13 +1562,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", - "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1663,15 +1578,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", - "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-transform-parameters": "^7.25.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1681,14 +1596,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", - "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1698,13 +1613,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", - "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1714,14 +1629,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", - "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1731,13 +1646,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", - "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1747,14 +1662,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", - "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1764,15 +1679,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", - "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1782,13 +1697,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", - "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1798,13 +1713,13 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz", - "integrity": "sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1814,17 +1729,17 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", - "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-jsx": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1834,13 +1749,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz", - "integrity": "sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.7" + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1850,14 +1765,14 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz", - "integrity": "sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1867,13 +1782,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", - "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1884,13 +1799,13 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", - "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1900,13 +1815,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", - "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1916,14 +1831,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", - "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1933,13 +1848,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", - "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1949,13 +1864,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", - "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1965,13 +1880,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", - "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1981,13 +1896,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", - "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1997,14 +1912,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", - "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2014,14 +1929,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", - "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2031,14 +1946,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", - "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2210,9 +2125,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", - "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2222,32 +2137,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2266,14 +2181,13 @@ } }, "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2462,9 +2376,9 @@ } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", - "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.3.tgz", + "integrity": "sha512-15WQTALDyxAwSgAvLt7BksAssiSrNNhTv4zM7qX9U6R7FtpNskVVakzWQlYODlwPwXhGpKPmB10LM943pxMe7w==", "dev": true, "funding": [ { @@ -2485,9 +2399,9 @@ } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", - "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "dev": true, "funding": [ { @@ -2960,17 +2874,20 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } @@ -3698,9 +3615,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.2.tgz", + "integrity": "sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==", "cpu": [ "arm" ], @@ -3712,9 +3629,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.2.tgz", + "integrity": "sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==", "cpu": [ "arm64" ], @@ -3726,9 +3643,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.2.tgz", + "integrity": "sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==", "cpu": [ "arm64" ], @@ -3740,9 +3657,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.2.tgz", + "integrity": "sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==", "cpu": [ "x64" ], @@ -3753,10 +3670,38 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.2.tgz", + "integrity": "sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.2.tgz", + "integrity": "sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.2.tgz", + "integrity": "sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==", "cpu": [ "arm" ], @@ -3768,9 +3713,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.2.tgz", + "integrity": "sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==", "cpu": [ "arm" ], @@ -3782,9 +3727,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.2.tgz", + "integrity": "sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==", "cpu": [ "arm64" ], @@ -3796,9 +3741,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.2.tgz", + "integrity": "sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==", "cpu": [ "arm64" ], @@ -3810,9 +3755,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.2.tgz", + "integrity": "sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==", "cpu": [ "ppc64" ], @@ -3824,9 +3769,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.2.tgz", + "integrity": "sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==", "cpu": [ "riscv64" ], @@ -3838,9 +3783,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.2.tgz", + "integrity": "sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==", "cpu": [ "s390x" ], @@ -3852,9 +3797,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.2.tgz", + "integrity": "sha512-jOG/0nXb3z+EM6SioY8RofqqmZ+9NKYvJ6QQaa9Mvd3RQxlH68/jcB/lpyVt4lCiqr04IyaC34NzhUqcXbB5FQ==", "cpu": [ "x64" ], @@ -3866,9 +3811,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.2.tgz", + "integrity": "sha512-XAo7cJec80NWx9LlZFEJQxqKOMz/lX3geWs2iNT5CHIERLFfd90f3RYLLjiCBm1IMaQ4VOX/lTC9lWfzzQm14Q==", "cpu": [ "x64" ], @@ -3880,9 +3825,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.2.tgz", + "integrity": "sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==", "cpu": [ "arm64" ], @@ -3894,9 +3839,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.2.tgz", + "integrity": "sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==", "cpu": [ "ia32" ], @@ -3908,9 +3853,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.2.tgz", + "integrity": "sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==", "cpu": [ "x64" ], @@ -4568,12 +4513,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.7.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.7.tgz", - "integrity": "sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==", + "version": "22.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", + "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.19.8" } }, "node_modules/@types/normalize-package-data": { @@ -4607,14 +4552,14 @@ "license": "MIT" }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz", - "integrity": "sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", + "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.10.0", - "@typescript-eslint/visitor-keys": "8.10.0" + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4625,9 +4570,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz", - "integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", + "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", "dev": true, "license": "MIT", "engines": { @@ -4639,14 +4584,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz", - "integrity": "sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", + "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.10.0", - "@typescript-eslint/visitor-keys": "8.10.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4684,16 +4629,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.10.0.tgz", - "integrity": "sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", + "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.10.0", - "@typescript-eslint/types": "8.10.0", - "@typescript-eslint/typescript-estree": "8.10.0" + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4707,13 +4652,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz", - "integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", + "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/types": "8.11.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -5312,9 +5257,9 @@ } }, "node_modules/acorn": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", - "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5476,6 +5421,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -5754,9 +5709,9 @@ } }, "node_modules/axe-core": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.1.tgz", - "integrity": "sha512-qPC9o+kD8Tir0lzNGLeghbOrWMr3ZJpaRlCIb6Uobt/7N4FiEDvqUMnxzCHRHmg8vOg14kr5gVNyScRmbMaJ9g==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", "dev": true, "license": "MPL-2.0", "engines": { @@ -5901,9 +5856,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "funding": [ { "type": "opencollective", @@ -5920,10 +5875,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -6041,9 +5996,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "version": "1.0.30001673", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001673.tgz", + "integrity": "sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw==", "funding": [ { "type": "opencollective", @@ -6061,9 +6016,9 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, "license": "MIT", "dependencies": { @@ -6634,9 +6589,9 @@ "license": "MIT" }, "node_modules/cytoscape": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.2.tgz", - "integrity": "sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==", + "version": "3.30.3", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.3.tgz", + "integrity": "sha512-HncJ9gGJbVtw7YXtIs3+6YAFSSiKsom0amWc33Z7QbylbY2JGMrA0yz4EwrdTScZxnwclXeEZHzO5pxoy0ZE4g==", "license": "MIT", "engines": { "node": ">=0.10" @@ -7246,39 +7201,6 @@ "node": ">=6" } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -7528,9 +7450,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.41", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", - "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", + "version": "1.5.47", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.47.tgz", + "integrity": "sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -7710,27 +7632,6 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-iterator-helpers": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", @@ -8182,13 +8083,13 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", - "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, "license": "MIT", "dependencies": { - "aria-query": "~5.1.3", + "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", @@ -8196,14 +8097,13 @@ "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" + "string.prototype.includes": "^2.0.1" }, "engines": { "node": ">=4.0" @@ -8212,16 +8112,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8307,10 +8197,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint-plugin-playwright/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-react": { - "version": "7.36.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz", - "integrity": "sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==", + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, "license": "MIT", "dependencies": { @@ -8319,7 +8222,7 @@ "array.prototype.flatmap": "^1.3.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.1.0", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", @@ -8496,6 +8399,116 @@ } } }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", + "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.16.1", + "@typescript-eslint/utils": "7.16.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", + "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", + "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/visitor-keys": "7.16.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "7.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", + "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.16.1", + "@typescript-eslint/types": "7.16.1", + "@typescript-eslint/typescript-estree": "7.16.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/parser": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", @@ -8596,100 +8609,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/type-utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz", - "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.16.1", - "@typescript-eslint/utils": "7.16.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", - "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", - "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/types": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -8704,7 +8629,6 @@ "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", @@ -8734,7 +8658,6 @@ "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" @@ -8753,7 +8676,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8765,16 +8687,16 @@ } }, "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz", - "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.16.1", - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/typescript-estree": "7.16.1" + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -8787,12 +8709,16 @@ "eslint": "^8.56.0" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz", - "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==", + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -8801,21 +8727,15 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.16.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz", - "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==", + "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.16.1", - "@typescript-eslint/visitor-keys": "7.16.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -8823,27 +8743,6 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/eslint-plugin-sonarjs/node_modules/@typescript-eslint/visitor-keys": { @@ -9028,6 +8927,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint-plugin-vue/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-wc": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-2.2.0.tgz", @@ -9043,9 +8955,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9053,7 +8965,7 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -9107,23 +9019,6 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", - "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10192,23 +10087,6 @@ "node": ">=10.13.0" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -12101,23 +11979,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -13342,16 +13203,6 @@ "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -13549,9 +13400,9 @@ } }, "node_modules/regexpu-core/node_modules/regjsparser": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.1.tgz", - "integrity": "sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", + "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -14096,9 +13947,9 @@ } }, "node_modules/solid-js": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.2.tgz", - "integrity": "sha512-fe/K03nV+kMFJYhAOE8AIQHcGxB4rMIEoEyrulbtmf217NffbbwBqJnJI4ovt16e+kaIt0czE2WA7mP/pYN9yg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.3.tgz", + "integrity": "sha512-5ba3taPoZGt9GY3YlsCB24kCg0Lv/rie/HTD4kG6h4daZZz7+yK02xn8Vx8dLYBc9i6Ps5JwAbEiqjmKaLB3Ag==", "license": "MIT", "dependencies": { "csstype": "^3.1.0", @@ -14265,19 +14116,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -15236,15 +15074,6 @@ "@popperjs/core": "^2.9.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -15360,16 +15189,13 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/typed-array-buffer": { @@ -15667,9 +15493,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", - "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", + "version": "5.4.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", + "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15778,9 +15604,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.2.tgz", + "integrity": "sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==", "dev": true, "license": "MIT", "dependencies": { @@ -15794,22 +15620,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@rollup/rollup-android-arm-eabi": "4.24.2", + "@rollup/rollup-android-arm64": "4.24.2", + "@rollup/rollup-darwin-arm64": "4.24.2", + "@rollup/rollup-darwin-x64": "4.24.2", + "@rollup/rollup-freebsd-arm64": "4.24.2", + "@rollup/rollup-freebsd-x64": "4.24.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.2", + "@rollup/rollup-linux-arm-musleabihf": "4.24.2", + "@rollup/rollup-linux-arm64-gnu": "4.24.2", + "@rollup/rollup-linux-arm64-musl": "4.24.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.2", + "@rollup/rollup-linux-riscv64-gnu": "4.24.2", + "@rollup/rollup-linux-s390x-gnu": "4.24.2", + "@rollup/rollup-linux-x64-gnu": "4.24.2", + "@rollup/rollup-linux-x64-musl": "4.24.2", + "@rollup/rollup-win32-arm64-msvc": "4.24.2", + "@rollup/rollup-win32-ia32-msvc": "4.24.2", + "@rollup/rollup-win32-x64-msvc": "4.24.2", "fsevents": "~2.3.2" } }, @@ -15969,9 +15797,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.1.6.tgz", - "integrity": "sha512-ng11B8B/ZADUMMOsRbqv0arc442q7lifSubD0v8oDXIFoMg/mXwAPUunrroIDkY+mcD0dHKccdaznSVp8EoX3w==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.1.8.tgz", + "integrity": "sha512-ii36gDzrYAfOQIkOlo44yceDdT5269gKmNGxf07Qx6seH2U50+tQ2ol02XLhYPmxrh6YabAsOdte8WDrpaO6Tw==", "dev": true, "license": "MIT" }, @@ -16000,6 +15828,23 @@ "eslint": ">=6.0.0" } }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", diff --git a/web_src/fomantic/package-lock.json b/web_src/fomantic/package-lock.json index 43eec8123b..3cefb665cc 100644 --- a/web_src/fomantic/package-lock.json +++ b/web_src/fomantic/package-lock.json @@ -492,12 +492,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.7.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.7.tgz", - "integrity": "sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==", + "version": "22.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", + "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.19.8" } }, "node_modules/@types/vinyl": { @@ -1115,9 +1115,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "funding": [ { "type": "opencollective", @@ -1134,10 +1134,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -1219,9 +1219,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", - "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "version": "1.0.30001673", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001673.tgz", + "integrity": "sha512-WTrjUCSMp3LYX0nE12ECkV0a+e6LC85E0Auz75555/qr78Oc8YWhEPNfDd6SHdtlCMSzqtuXY0uyEMNRcsKpKw==", "funding": [ { "type": "opencollective", @@ -1961,9 +1961,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.41", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", - "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", + "version": "1.5.47", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.47.tgz", + "integrity": "sha512-zS5Yer0MOYw4rtK2iq43cJagHZ8sXN0jDHDKzB+86gSBSAI4v07S97mcq+Gs2vclAxSh1j7vOAHxSVgduiiuVQ==", "license": "ISC" }, "node_modules/emoji-regex": { From 266e0b2ce91ebd18858071d7702589971384402c Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 23 Oct 2024 00:48:46 +0200 Subject: [PATCH 14/75] security: add permission check to 'delete branch after merge' - Add a permission check that the doer has write permissions to the head repository if the the 'delete branch after merge' is enabled when merging a pull request. - Unify the checks in the web and API router to `DeleteBranchAfterMerge`. - Added integration tests. --- options/locale/locale_en-US.ini | 4 +++ release-notes/5718.md | 1 + routers/api/v1/repo/pull.go | 33 ++++++----------------- routers/web/repo/pull.go | 29 ++++++++++++--------- services/repository/branch.go | 39 ++++++++++++++++++++++++++++ tests/integration/api_pull_test.go | 38 +++++++++++++++++++++++++++ tests/integration/pull_merge_test.go | 32 +++++++++++++++++++++++ 7 files changed, 139 insertions(+), 37 deletions(-) create mode 100644 release-notes/5718.md diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 113c94d71f..013a684a7c 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1979,6 +1979,10 @@ pulls.auto_merge_canceled_schedule = The auto merge was canceled for this pull r pulls.auto_merge_newly_scheduled_comment = `scheduled this pull request to auto merge when all checks succeed %[1]s` pulls.auto_merge_canceled_schedule_comment = `canceled auto merging this pull request when all checks succeed %[1]s` +pulls.delete_after_merge.head_branch.is_default = The head branch you want to delete is the default branch and cannot be deleted. +pulls.delete_after_merge.head_branch.is_protected = The head branch you want to delete is a protected branch and cannot be deleted. +pulls.delete_after_merge.head_branch.insufficient_branch = You don't have permission to delete the head branch. + pulls.delete.title = Delete this pull request? pulls.delete.text = Do you really want to delete this pull request? (This will permanently remove all content. Consider closing it instead, if you intend to keep it archived) diff --git a/release-notes/5718.md b/release-notes/5718.md new file mode 100644 index 0000000000..f44178d1fe --- /dev/null +++ b/release-notes/5718.md @@ -0,0 +1 @@ +Because of a missing permission check, the branch used to propose a pull request to a repository can always be deleted by the user performing the merge. It was fixed so that such a deletion is only allowed if the user performing the merge has write permission to the repository from which the pull request was made. diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 748ef18802..ace107b289 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -28,6 +28,7 @@ import ( "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/api/v1/utils" asymkey_service "code.gitea.io/gitea/services/asymkey" @@ -1034,17 +1035,6 @@ func MergePullRequest(ctx *context.APIContext) { log.Trace("Pull request merged: %d", pr.ID) if form.DeleteBranchAfterMerge { - // Don't cleanup when there are other PR's that use this branch as head branch. - exist, err := issues_model.HasUnmergedPullRequestsByHeadInfo(ctx, pr.HeadRepoID, pr.HeadBranch) - if err != nil { - ctx.ServerError("HasUnmergedPullRequestsByHeadInfo", err) - return - } - if exist { - ctx.Status(http.StatusOK) - return - } - var headRepo *git.Repository if ctx.Repo != nil && ctx.Repo.Repository != nil && ctx.Repo.Repository.ID == pr.HeadRepoID && ctx.Repo.GitRepo != nil { headRepo = ctx.Repo.GitRepo @@ -1056,27 +1046,20 @@ func MergePullRequest(ctx *context.APIContext) { } defer headRepo.Close() } - if err := pull_service.RetargetChildrenOnMerge(ctx, ctx.Doer, pr); err != nil { - ctx.Error(http.StatusInternalServerError, "RetargetChildrenOnMerge", err) - return - } - if err := repo_service.DeleteBranch(ctx, ctx.Doer, pr.HeadRepo, headRepo, pr.HeadBranch); err != nil { + + if err := repo_service.DeleteBranchAfterMerge(ctx, ctx.Doer, pr, headRepo); err != nil { switch { - case git.IsErrBranchNotExist(err): - ctx.NotFound(err) case errors.Is(err, repo_service.ErrBranchIsDefault): - ctx.Error(http.StatusForbidden, "DefaultBranch", fmt.Errorf("can not delete default branch")) + ctx.Error(http.StatusForbidden, "DefaultBranch", fmt.Errorf("the head branch is the default branch")) case errors.Is(err, git_model.ErrBranchIsProtected): - ctx.Error(http.StatusForbidden, "IsProtectedBranch", fmt.Errorf("branch protected")) + ctx.Error(http.StatusForbidden, "IsProtectedBranch", fmt.Errorf("the head branch is protected")) + case errors.Is(err, util.ErrPermissionDenied): + ctx.Error(http.StatusForbidden, "HeadBranch", fmt.Errorf("insufficient permission to delete head branch")) default: - ctx.Error(http.StatusInternalServerError, "DeleteBranch", err) + ctx.Error(http.StatusInternalServerError, "DeleteBranchAfterMerge", err) } return } - if err := issues_model.AddDeletePRBranchComment(ctx, ctx.Doer, pr.BaseRepo, pr.Issue.ID, pr.HeadBranch); err != nil { - // Do not fail here as branch has already been deleted - log.Error("DeleteBranch: %v", err) - } } ctx.Status(http.StatusOK) diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index bc85012700..14b03b9fa4 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -1389,21 +1389,11 @@ func MergePullRequest(ctx *context.Context) { log.Trace("Pull request merged: %d", pr.ID) if form.DeleteBranchAfterMerge { - // Don't cleanup when other pr use this branch as head branch - exist, err := issues_model.HasUnmergedPullRequestsByHeadInfo(ctx, pr.HeadRepoID, pr.HeadBranch) - if err != nil { - ctx.ServerError("HasUnmergedPullRequestsByHeadInfo", err) - return - } - if exist { - ctx.JSONRedirect(issue.Link()) - return - } - var headRepo *git.Repository if ctx.Repo != nil && ctx.Repo.Repository != nil && pr.HeadRepoID == ctx.Repo.Repository.ID && ctx.Repo.GitRepo != nil { headRepo = ctx.Repo.GitRepo } else { + var err error headRepo, err = gitrepo.OpenRepository(ctx, pr.HeadRepo) if err != nil { ctx.ServerError(fmt.Sprintf("OpenRepository[%s]", pr.HeadRepo.FullName()), err) @@ -1411,7 +1401,22 @@ func MergePullRequest(ctx *context.Context) { } defer headRepo.Close() } - deleteBranch(ctx, pr, headRepo) + + if err := repo_service.DeleteBranchAfterMerge(ctx, ctx.Doer, pr, headRepo); err != nil { + switch { + case errors.Is(err, repo_service.ErrBranchIsDefault): + ctx.Flash.Error(ctx.Tr("repo.pulls.delete_after_merge.head_branch.is_default")) + case errors.Is(err, git_model.ErrBranchIsProtected): + ctx.Flash.Error(ctx.Tr("repo.pulls.delete_after_merge.head_branch.is_protected")) + case errors.Is(err, util.ErrPermissionDenied): + ctx.Flash.Error(ctx.Tr("repo.pulls.delete_after_merge.head_branch.insufficient_branch")) + default: + ctx.ServerError("DeleteBranchAfterMerge", err) + } + + ctx.JSONRedirect(issue.Link()) + return + } } ctx.JSONRedirect(issue.Link()) diff --git a/services/repository/branch.go b/services/repository/branch.go index f0e7120926..7d92053178 100644 --- a/services/repository/branch.go +++ b/services/repository/branch.go @@ -14,7 +14,9 @@ import ( "code.gitea.io/gitea/models/db" git_model "code.gitea.io/gitea/models/git" issues_model "code.gitea.io/gitea/models/issues" + "code.gitea.io/gitea/models/perm/access" repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/models/unit" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/gitrepo" @@ -24,8 +26,10 @@ import ( "code.gitea.io/gitea/modules/queue" repo_module "code.gitea.io/gitea/modules/repository" "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" notify_service "code.gitea.io/gitea/services/notify" + pull_service "code.gitea.io/gitea/services/pull" files_service "code.gitea.io/gitea/services/repository/files" "xorm.io/builder" @@ -475,6 +479,41 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R return nil } +// DeleteBranchAfterMerge deletes the head branch after a PR was merged assiociated with the head branch. +func DeleteBranchAfterMerge(ctx context.Context, doer *user_model.User, pr *issues_model.PullRequest, headRepo *git.Repository) error { + // Don't cleanup when there are other PR's that use this branch as head branch. + exist, err := issues_model.HasUnmergedPullRequestsByHeadInfo(ctx, pr.HeadRepoID, pr.HeadBranch) + if err != nil { + return err + } + if exist { + return nil + } + + // Ensure the doer has write permissions to the head repository of the branch it wants to delete. + perm, err := access.GetUserRepoPermission(ctx, pr.HeadRepo, doer) + if err != nil { + return err + } + if !perm.CanWrite(unit.TypeCode) { + return util.NewPermissionDeniedErrorf("Must have write permission to the head repository") + } + + if err := pull_service.RetargetChildrenOnMerge(ctx, doer, pr); err != nil { + return err + } + if err := DeleteBranch(ctx, doer, pr.HeadRepo, headRepo, pr.HeadBranch); err != nil { + return err + } + + if err := issues_model.AddDeletePRBranchComment(ctx, doer, pr.BaseRepo, pr.Issue.ID, pr.HeadBranch); err != nil { + // Do not fail here as branch has already been deleted + log.Error("DeleteBranchAfterMerge: %v", err) + } + + return nil +} + type BranchSyncOptions struct { RepoID int64 } diff --git a/tests/integration/api_pull_test.go b/tests/integration/api_pull_test.go index 51c25fb75f..7b95d441dd 100644 --- a/tests/integration/api_pull_test.go +++ b/tests/integration/api_pull_test.go @@ -7,6 +7,8 @@ import ( "fmt" "io" "net/http" + "net/url" + "strings" "testing" auth_model "code.gitea.io/gitea/models/auth" @@ -17,6 +19,7 @@ import ( user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/services/forms" issue_service "code.gitea.io/gitea/services/issue" "code.gitea.io/gitea/tests" @@ -309,3 +312,38 @@ func doAPIGetPullFiles(ctx APITestContext, pr *api.PullRequest, callback func(*t } } } + +func TestAPIPullDeleteBranchPerms(t *testing.T) { + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + user2Session := loginUser(t, "user2") + user4Session := loginUser(t, "user4") + testRepoFork(t, user4Session, "user2", "repo1", "user4", "repo1") + testEditFileToNewBranch(t, user2Session, "user2", "repo1", "master", "base-pr", "README.md", "Hello, World\n(Edited - base PR)\n") + + req := NewRequestWithValues(t, "POST", "/user4/repo1/compare/master...user2/repo1:base-pr", map[string]string{ + "_csrf": GetCSRF(t, user4Session, "/user4/repo1/compare/master...user2/repo1:base-pr"), + "title": "Testing PR", + }) + resp := user4Session.MakeRequest(t, req, http.StatusOK) + elem := strings.Split(test.RedirectURL(resp), "/") + + token := getTokenForLoggedInUser(t, user4Session, auth_model.AccessTokenScopeWriteRepository) + req = NewRequestWithValues(t, "POST", "/api/v1/repos/user4/repo1/pulls/"+elem[4]+"/merge", map[string]string{ + "do": "merge", + "delete_branch_after_merge": "on", + }).AddTokenAuth(token) + resp = user4Session.MakeRequest(t, req, http.StatusForbidden) + + type userResponse struct { + Message string `json:"message"` + } + var bodyResp userResponse + DecodeJSON(t, resp, &bodyResp) + + assert.EqualValues(t, "insufficient permission to delete head branch", bodyResp.Message) + + // Check that the branch still exist. + req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/branches/base-pr").AddTokenAuth(token) + user4Session.MakeRequest(t, req, http.StatusOK) + }) +} diff --git a/tests/integration/pull_merge_test.go b/tests/integration/pull_merge_test.go index 0f25bdebac..caf100144d 100644 --- a/tests/integration/pull_merge_test.go +++ b/tests/integration/pull_merge_test.go @@ -37,6 +37,7 @@ import ( "code.gitea.io/gitea/modules/test" "code.gitea.io/gitea/modules/translation" "code.gitea.io/gitea/services/automerge" + forgejo_context "code.gitea.io/gitea/services/context" "code.gitea.io/gitea/services/forms" "code.gitea.io/gitea/services/pull" commitstatus_service "code.gitea.io/gitea/services/repository/commitstatus" @@ -1150,3 +1151,34 @@ func TestPullAutoMergeAfterCommitStatusSucceedAndApprovalForAgitFlow(t *testing. unittest.AssertNotExistsBean(t, &pull_model.AutoMerge{PullID: pr.ID}) }) } + +func TestPullDeleteBranchPerms(t *testing.T) { + onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) { + user2Session := loginUser(t, "user2") + user4Session := loginUser(t, "user4") + testRepoFork(t, user4Session, "user2", "repo1", "user4", "repo1") + testEditFileToNewBranch(t, user2Session, "user2", "repo1", "master", "base-pr", "README.md", "Hello, World\n(Edited - base PR)\n") + + req := NewRequestWithValues(t, "POST", "/user4/repo1/compare/master...user2/repo1:base-pr", map[string]string{ + "_csrf": GetCSRF(t, user4Session, "/user4/repo1/compare/master...user2/repo1:base-pr"), + "title": "Testing PR", + }) + resp := user4Session.MakeRequest(t, req, http.StatusOK) + elem := strings.Split(test.RedirectURL(resp), "/") + + req = NewRequestWithValues(t, "POST", "/user4/repo1/pulls/"+elem[4]+"/merge", map[string]string{ + "_csrf": GetCSRF(t, user4Session, "/user4/repo1/pulls/"+elem[4]), + "do": "merge", + "delete_branch_after_merge": "on", + }) + user4Session.MakeRequest(t, req, http.StatusOK) + + flashCookie := user4Session.GetCookie(forgejo_context.CookieNameFlash) + assert.NotNil(t, flashCookie) + assert.EqualValues(t, "error%3DYou%2Bdon%2527t%2Bhave%2Bpermission%2Bto%2Bdelete%2Bthe%2Bhead%2Bbranch.", flashCookie.Value) + + // Check that the branch still exist. + req = NewRequest(t, "GET", "/user2/repo1/src/branch/base-pr") + user4Session.MakeRequest(t, req, http.StatusOK) + }) +} From 53231bad611285b2c52c489a308cbdc8f6dce222 Mon Sep 17 00:00:00 2001 From: Gusted Date: Fri, 25 Oct 2024 08:18:26 +0200 Subject: [PATCH 15/75] fix(sec): use constant time check for internal token --- release-notes/5719.md | 1 + routers/private/internal.go | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 release-notes/5719.md diff --git a/release-notes/5719.md b/release-notes/5719.md new file mode 100644 index 0000000000..19a74825e4 --- /dev/null +++ b/release-notes/5719.md @@ -0,0 +1 @@ +Forgejo generates a token which is used to authenticate web endpoints that are only meant to be used internally, for instance when the SSH daemon is used to push a commit with Git. The verification of this token was not done in constant time and was susceptible to [timing attacks](https://en.wikipedia.org/wiki/Timing_attack). A pre-condition for such an attack is the precise measurements of the time for each operation. Since it requires observing the timing of network operations, the issue is mitigated when a Forgejo instance is accessed over the internet because the ISP introduce unpredictable random delays. diff --git a/routers/private/internal.go b/routers/private/internal.go index ede310113c..311f59b60e 100644 --- a/routers/private/internal.go +++ b/routers/private/internal.go @@ -5,6 +5,7 @@ package private import ( + "crypto/subtle" "net/http" "strings" @@ -28,7 +29,7 @@ func CheckInternalToken(next http.Handler) http.Handler { http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden) return } - if len(fields) != 2 || fields[0] != "Bearer" || fields[1] != setting.InternalToken { + if len(fields) != 2 || fields[0] != "Bearer" || subtle.ConstantTimeCompare([]byte(fields[1]), []byte(setting.InternalToken)) == 0 { log.Debug("Forbidden attempt to access internal url: Authorization header: %s", tokens) http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden) } else { From f9a16f8be01457a6c6f1125df3e27cd9f6217245 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 28 Oct 2024 06:26:24 +0000 Subject: [PATCH 16/75] Update renovate to v38.133.0 --- .forgejo/workflows/renovate.yml | 2 +- Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml index 9cea4aea31..c399731430 100644 --- a/.forgejo/workflows/renovate.yml +++ b/.forgejo/workflows/renovate.yml @@ -23,7 +23,7 @@ jobs: runs-on: docker container: - image: code.forgejo.org/forgejo-contrib/renovate:38.128.6 + image: code.forgejo.org/forgejo-contrib/renovate:38.133.0 steps: - name: Load renovate repo cache diff --git a/Makefile b/Makefile index 1c47424d45..62cf4e536d 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ GOVULNCHECK_PACKAGE ?= golang.org/x/vuln/cmd/govulncheck@v1 # renovate: datasour DEADCODE_PACKAGE ?= golang.org/x/tools/cmd/deadcode@v0.26.0 # renovate: datasource=go GOMOCK_PACKAGE ?= go.uber.org/mock/mockgen@v0.4.0 # renovate: datasource=go GOPLS_PACKAGE ?= golang.org/x/tools/gopls@v0.16.2 # renovate: datasource=go -RENOVATE_NPM_PACKAGE ?= renovate@38.128.6 # renovate: datasource=docker packageName=code.forgejo.org/forgejo-contrib/renovate +RENOVATE_NPM_PACKAGE ?= renovate@38.133.0 # renovate: datasource=docker packageName=code.forgejo.org/forgejo-contrib/renovate ifeq ($(HAS_GO), yes) CGO_EXTRA_CFLAGS := -DSQLITE_MAX_VARIABLE_NUMBER=32766 From e8e0fe1feaa1b0f570daf8848bcb1ee79b424cf8 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Mon, 28 Oct 2024 09:08:48 +0100 Subject: [PATCH 17/75] docs: add links to the v7.0.10 & v9.0.1 release notes --- RELEASE-NOTES.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index e05288335f..65209ee54a 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -6,6 +6,10 @@ A [patch or minor release](https://semver.org/spec/v2.0.0.html) (e.g. upgrading The release notes of each release [are available in the corresponding milestone](https://codeberg.org/forgejo/forgejo/milestones), starting with [Forgejo 7.0.7](https://codeberg.org/forgejo/forgejo/milestone/7683) and [Forgejo 8.0.1](https://codeberg.org/forgejo/forgejo/milestone/7682). +## 9.0.1 + +The Forgejo v9.0.1 release notes are [available in the v9.0.1 milestone](https://codeberg.org/forgejo/forgejo/milestone/8544). + ## 9.0.0 The Forgejo v9.0.0 release notes are [available in the v9.0.0 milestone](https://codeberg.org/forgejo/forgejo/milestone/7235). @@ -159,6 +163,10 @@ A [companion blog post](https://forgejo.org/2024-07-release-v8-0/) provides addi - [PR](https://codeberg.org/forgejo/forgejo/pulls/2937): 31 March updates +## 7.0.10 + +The Forgejo v7.0.10 release notes are [available in the v7.0.10 milestone](https://codeberg.org/forgejo/forgejo/milestone/8286). + ## 7.0.9 The Forgejo v7.0.9 release notes are [available in the v7.0.9 milestone](https://codeberg.org/forgejo/forgejo/milestone/8232). From 75ce0bf06bef4b15372213cb0e77cfedb62d6a84 Mon Sep 17 00:00:00 2001 From: JakobDev Date: Mon, 28 Oct 2024 17:37:24 +0100 Subject: [PATCH 18/75] Fix test --- tests/integration/milestone_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/milestone_test.go b/tests/integration/milestone_test.go index 2a01786dc0..0a475e0967 100644 --- a/tests/integration/milestone_test.go +++ b/tests/integration/milestone_test.go @@ -38,5 +38,5 @@ func TestMilestonesCount(t *testing.T) { closedCount := htmlDoc.doc.Find("a[data-test-name='closed-issue-count']").Text() assert.Contains(t, closedCount, "1\u00a0Closed") - assert.Empty(t, htmlDoc.doc.Find("a[data-test-name='allissue-count']").Nodes) + assert.Empty(t, htmlDoc.doc.Find("a[data-test-name='all-issue-count']").Nodes) } From 9d687f1069dfa6014947af85a80dbb5f8f22b20d Mon Sep 17 00:00:00 2001 From: 0ko <0ko@noreply.codeberg.org> Date: Tue, 29 Oct 2024 05:31:49 +0000 Subject: [PATCH 19/75] feat(ui): link back to one-time code page from scratch code page (#5712) Preview: https://codeberg.org/attachments/b60c5d7c-103b-4227-9b0d-3d765dba2431 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/5712 Reviewed-by: Gusted --- options/locale/locale_en-US.ini | 1 + templates/user/auth/twofa_scratch.tmpl | 1 + 2 files changed, 2 insertions(+) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 013a684a7c..289b8aa17f 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -442,6 +442,7 @@ verify = Verify unauthorized_credentials = Credentials are incorrect or have expired. Retry your command or see %s for more information scratch_code = Scratch code use_scratch_code = Use a scratch code +use_onetime_code = Use a one-time code twofa_scratch_used = You have used your scratch code. You have been redirected to the two-factor settings page so you may remove your device enrollment or generate a new scratch code. twofa_passcode_incorrect = Your passcode is incorrect. If you misplaced your device, use your scratch code to sign in. twofa_scratch_token_incorrect = Your scratch code is incorrect. diff --git a/templates/user/auth/twofa_scratch.tmpl b/templates/user/auth/twofa_scratch.tmpl index 23ad77f2a9..7d7e3c1b54 100644 --- a/templates/user/auth/twofa_scratch.tmpl +++ b/templates/user/auth/twofa_scratch.tmpl @@ -16,6 +16,7 @@
+ {{ctx.Locale.Tr "auth.use_onetime_code"}}
From 76ed17453e0e1a3ae2d9307b0df182be9f82c310 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 29 Oct 2024 10:03:46 +0000 Subject: [PATCH 20/75] Update vitest monorepo to v2.1.4 --- package-lock.json | 142 +++++++++++++++++++++++++--------------------- package.json | 4 +- 2 files changed, 78 insertions(+), 68 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2841e704f6..d08c9b7c7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "@stylistic/eslint-plugin-js": "2.9.0", "@stylistic/stylelint-plugin": "3.1.1", "@vitejs/plugin-vue": "5.1.4", - "@vitest/coverage-v8": "2.1.3", + "@vitest/coverage-v8": "2.1.4", "@vitest/eslint-plugin": "1.1.7", "@vue/test-utils": "2.4.6", "eslint": "9.13.0", @@ -94,7 +94,7 @@ "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", "vite-string-plugin": "1.3.4", - "vitest": "2.1.3" + "vitest": "2.1.4" }, "engines": { "node": ">= 18.0.0" @@ -4697,21 +4697,21 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.3.tgz", - "integrity": "sha512-2OJ3c7UPoFSmBZwqD2VEkUw6A/tzPF0LmW0ZZhhB8PFxuc+9IBG/FaSM+RLEenc7ljzFvGN+G0nGQoZnh7sy2A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.4.tgz", + "integrity": "sha512-FPKQuJfR6VTfcNMcGpqInmtJuVXFSCd9HQltYncfR01AzXhLucMEtQ5SinPdZxsT5x/5BK7I5qFJ5/ApGCmyTQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.6", + "debug": "^4.3.7", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.11", - "magicast": "^0.3.4", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", "std-env": "^3.7.0", "test-exclude": "^7.0.1", "tinyrainbow": "^1.2.0" @@ -4720,8 +4720,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "2.1.3", - "vitest": "2.1.3" + "@vitest/browser": "2.1.4", + "vitest": "2.1.4" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -4761,15 +4761,15 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz", - "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.4.tgz", + "integrity": "sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", + "@vitest/spy": "2.1.4", + "@vitest/utils": "2.1.4", + "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, "funding": { @@ -4777,22 +4777,21 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz", - "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.4.tgz", + "integrity": "sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.3", + "@vitest/spy": "2.1.4", "estree-walker": "^3.0.3", - "magic-string": "^0.30.11" + "magic-string": "^0.30.12" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/spy": "2.1.3", - "msw": "^2.3.5", + "msw": "^2.4.9", "vite": "^5.0.0" }, "peerDependenciesMeta": { @@ -4832,9 +4831,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", - "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", + "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==", "dev": true, "license": "MIT", "dependencies": { @@ -4845,13 +4844,13 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz", - "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.4.tgz", + "integrity": "sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.3", + "@vitest/utils": "2.1.4", "pathe": "^1.1.2" }, "funding": { @@ -4859,14 +4858,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz", - "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.4.tgz", + "integrity": "sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.3", - "magic-string": "^0.30.11", + "@vitest/pretty-format": "2.1.4", + "magic-string": "^0.30.12", "pathe": "^1.1.2" }, "funding": { @@ -4884,27 +4883,27 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", - "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.4.tgz", + "integrity": "sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^3.0.0" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz", - "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz", + "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.3", - "loupe": "^3.1.1", + "@vitest/pretty-format": "2.1.4", + "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, "funding": { @@ -9126,6 +9125,16 @@ "node": ">=0.8.x" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -15553,14 +15562,14 @@ } }, "node_modules/vite-node": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz", - "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.4.tgz", + "integrity": "sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.6", + "debug": "^4.3.7", "pathe": "^1.1.2", "vite": "^5.0.0" }, @@ -15642,30 +15651,31 @@ } }, "node_modules/vitest": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz", - "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.4.tgz", + "integrity": "sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "2.1.3", - "@vitest/mocker": "2.1.3", - "@vitest/pretty-format": "^2.1.3", - "@vitest/runner": "2.1.3", - "@vitest/snapshot": "2.1.3", - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", - "debug": "^4.3.6", - "magic-string": "^0.30.11", + "@vitest/expect": "2.1.4", + "@vitest/mocker": "2.1.4", + "@vitest/pretty-format": "^2.1.4", + "@vitest/runner": "2.1.4", + "@vitest/snapshot": "2.1.4", + "@vitest/spy": "2.1.4", + "@vitest/utils": "2.1.4", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", "pathe": "^1.1.2", "std-env": "^3.7.0", "tinybench": "^2.9.0", - "tinyexec": "^0.3.0", - "tinypool": "^1.0.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.3", + "vite-node": "2.1.4", "why-is-node-running": "^2.3.0" }, "bin": { @@ -15680,8 +15690,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.3", - "@vitest/ui": "2.1.3", + "@vitest/browser": "2.1.4", + "@vitest/ui": "2.1.4", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index 66d0c428e5..c420353260 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "@stylistic/eslint-plugin-js": "2.9.0", "@stylistic/stylelint-plugin": "3.1.1", "@vitejs/plugin-vue": "5.1.4", - "@vitest/coverage-v8": "2.1.3", + "@vitest/coverage-v8": "2.1.4", "@vitest/eslint-plugin": "1.1.7", "@vue/test-utils": "2.4.6", "eslint": "9.13.0", @@ -93,7 +93,7 @@ "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", "vite-string-plugin": "1.3.4", - "vitest": "2.1.3" + "vitest": "2.1.4" }, "browserslist": ["defaults"] } From 8dc72589cafd0881e234af489c4b3d643422f7e9 Mon Sep 17 00:00:00 2001 From: Anbraten Date: Tue, 29 Oct 2024 11:47:39 +0100 Subject: [PATCH 21/75] Add typescript --- Makefile | 7 +- eslint.config.mjs | 2260 +++++++++--------- package-lock.json | 777 ++---- package.json | 8 +- playwright.config.js => playwright.config.ts | 1 - tsconfig.json | 30 + vitest.config.js => vitest.config.ts | 0 web_src/js/features/repo-legacy.js | 7 +- web_src/js/webcomponents/overflow-menu.js | 2 +- webpack.config.js | 4 +- 10 files changed, 1354 insertions(+), 1742 deletions(-) rename playwright.config.js => playwright.config.ts (99%) create mode 100644 tsconfig.json rename vitest.config.js => vitest.config.ts (100%) diff --git a/Makefile b/Makefile index 62cf4e536d..309efe3875 100644 --- a/Makefile +++ b/Makefile @@ -164,9 +164,8 @@ TAR_EXCLUDES := .git data indexers queues log node_modules $(EXECUTABLE) $(FOMAN GO_DIRS := build cmd models modules routers services tests WEB_DIRS := web_src/js web_src/css -ESLINT_FILES := web_src/js tools *.js *.mjs tests/e2e/*.js tests/e2e/shared/*.js STYLELINT_FILES := web_src/css web_src/js/components/*.vue -SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) docs/content templates options/locale/locale_en-US.ini .github $(wildcard *.go *.js *.md *.yml *.yaml *.toml) +SPELLCHECK_FILES := $(GO_DIRS) $(WEB_DIRS) docs/content templates options/locale/locale_en-US.ini .github $(wildcard *.go *.js *.ts *.vue *.md *.yml *.yaml *.toml) GO_SOURCES := $(wildcard *.go) GO_SOURCES += $(shell find $(GO_DIRS) -type f -name "*.go" ! -path modules/options/bindata.go ! -path modules/public/bindata.go ! -path modules/templates/bindata.go) @@ -437,11 +436,11 @@ lint-codespell-fix-i: .PHONY: lint-js lint-js: node_modules - npx eslint --color --max-warnings=0 $(ESLINT_FILES) + npx eslint --color --max-warnings=0 .PHONY: lint-js-fix lint-js-fix: node_modules - npx eslint --color --max-warnings=0 $(ESLINT_FILES) --fix + npx eslint --color --max-warnings=0 --fix .PHONY: lint-css lint-css: node_modules diff --git a/eslint.config.mjs b/eslint.config.mjs index ee2aa5da27..da1b2b5d49 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -14,1148 +14,1156 @@ import wc from 'eslint-plugin-wc'; import globals from 'globals'; import vue from 'eslint-plugin-vue'; import vueScopedCss from 'eslint-plugin-vue-scoped-css'; +import tseslint from 'typescript-eslint'; -export default [{ - ignores: ['web_src/js/vendor', 'web_src/fomantic', 'public/assets/js'], -}, { - plugins: { - '@eslint-community/eslint-comments': eslintCommunityEslintPluginEslintComments, - '@stylistic/js': stylisticEslintPluginJs, - '@vitest': vitest, - 'array-func': arrayFunc, - 'import-x': eslintPluginImportX, - 'no-jquery': noJquery, - 'no-use-extend-native': noUseExtendNative, - regexp, - sonarjs, - unicorn, - playwright, - 'vitest-globals': vitestGlobals, - vue, - 'vue-scoped-css': vueScopedCss, - wc, +export default tseslint.config( + ...tseslint.configs.recommended, + eslintPluginImportX.flatConfigs.typescript, + { + ignores: ['web_src/js/vendor', 'web_src/fomantic', 'public/assets/js'], }, - - linterOptions: { - reportUnusedDisableDirectives: true, - }, - - languageOptions: { - globals: { - ...globals.node, + { + plugins: { + '@eslint-community/eslint-comments': eslintCommunityEslintPluginEslintComments, + '@stylistic/js': stylisticEslintPluginJs, + '@vitest': vitest, + 'array-func': arrayFunc, + 'import-x': eslintPluginImportX, + 'no-jquery': noJquery, + 'no-use-extend-native': noUseExtendNative, + regexp, + sonarjs, + unicorn, + playwright, + 'vitest-globals': vitestGlobals, + vue, + 'vue-scoped-css': vueScopedCss, + wc, }, - parserOptions: { + + linterOptions: { + reportUnusedDisableDirectives: true, + }, + + languageOptions: { + globals: { + ...globals.node, + }, + parserOptions: { + ecmaVersion: 'latest', + }, + + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + '@typescript-eslint/no-unused-vars': 'off', // TODO: enable this rule again + + '@eslint-community/eslint-comments/disable-enable-pair': [2], + '@eslint-community/eslint-comments/no-aggregating-enable': [2], + '@eslint-community/eslint-comments/no-duplicate-disable': [2], + '@eslint-community/eslint-comments/no-restricted-disable': [0], + '@eslint-community/eslint-comments/no-unlimited-disable': [2], + '@eslint-community/eslint-comments/no-unused-disable': [2], + '@eslint-community/eslint-comments/no-unused-enable': [2], + '@eslint-community/eslint-comments/no-use': [0], + '@eslint-community/eslint-comments/require-description': [0], + '@stylistic/js/array-bracket-newline': [0], + '@stylistic/js/array-bracket-spacing': [2, 'never'], + '@stylistic/js/array-element-newline': [0], + '@stylistic/js/arrow-parens': [2, 'always'], + + '@stylistic/js/arrow-spacing': [2, { + before: true, + after: true, + }], + + '@stylistic/js/block-spacing': [0], + + '@stylistic/js/brace-style': [2, '1tbs', { + allowSingleLine: true, + }], + + '@stylistic/js/comma-dangle': [2, 'always-multiline'], + + '@stylistic/js/comma-spacing': [2, { + before: false, + after: true, + }], + + '@stylistic/js/comma-style': [2, 'last'], + '@stylistic/js/computed-property-spacing': [2, 'never'], + '@stylistic/js/dot-location': [2, 'property'], + '@stylistic/js/eol-last': [2], + '@stylistic/js/function-call-spacing': [2, 'never'], + '@stylistic/js/function-call-argument-newline': [0], + '@stylistic/js/function-paren-newline': [0], + '@stylistic/js/generator-star-spacing': [0], + '@stylistic/js/implicit-arrow-linebreak': [0], + + '@stylistic/js/indent': [2, 2, { + ignoreComments: true, + SwitchCase: 1, + }], + + '@stylistic/js/key-spacing': [2], + '@stylistic/js/keyword-spacing': [2], + '@stylistic/js/linebreak-style': [2, 'unix'], + '@stylistic/js/lines-around-comment': [0], + '@stylistic/js/lines-between-class-members': [0], + '@stylistic/js/max-len': [0], + '@stylistic/js/max-statements-per-line': [0], + '@stylistic/js/multiline-ternary': [0], + '@stylistic/js/new-parens': [2], + '@stylistic/js/newline-per-chained-call': [0], + '@stylistic/js/no-confusing-arrow': [0], + '@stylistic/js/no-extra-parens': [0], + '@stylistic/js/no-extra-semi': [2], + '@stylistic/js/no-floating-decimal': [0], + '@stylistic/js/no-mixed-operators': [0], + '@stylistic/js/no-mixed-spaces-and-tabs': [2], + + '@stylistic/js/no-multi-spaces': [2, { + ignoreEOLComments: true, + + exceptions: { + Property: true, + }, + }], + + '@stylistic/js/no-multiple-empty-lines': [2, { + max: 1, + maxEOF: 0, + maxBOF: 0, + }], + + '@stylistic/js/no-tabs': [2], + '@stylistic/js/no-trailing-spaces': [2], + '@stylistic/js/no-whitespace-before-property': [2], + '@stylistic/js/nonblock-statement-body-position': [2], + '@stylistic/js/object-curly-newline': [0], + '@stylistic/js/object-curly-spacing': [2, 'never'], + '@stylistic/js/object-property-newline': [0], + '@stylistic/js/one-var-declaration-per-line': [0], + '@stylistic/js/operator-linebreak': [2, 'after'], + '@stylistic/js/padded-blocks': [2, 'never'], + '@stylistic/js/padding-line-between-statements': [0], + '@stylistic/js/quote-props': [0], + + '@stylistic/js/quotes': [2, 'single', { + avoidEscape: true, + allowTemplateLiterals: true, + }], + + '@stylistic/js/rest-spread-spacing': [2, 'never'], + + '@stylistic/js/semi': [2, 'always', { + omitLastInOneLineBlock: true, + }], + + '@stylistic/js/semi-spacing': [2, { + before: false, + after: true, + }], + + '@stylistic/js/semi-style': [2, 'last'], + '@stylistic/js/space-before-blocks': [2, 'always'], + + '@stylistic/js/space-before-function-paren': [2, { + anonymous: 'ignore', + named: 'never', + asyncArrow: 'always', + }], + + '@stylistic/js/space-in-parens': [2, 'never'], + '@stylistic/js/space-infix-ops': [2], + '@stylistic/js/space-unary-ops': [2], + '@stylistic/js/spaced-comment': [2, 'always'], + '@stylistic/js/switch-colon-spacing': [2], + '@stylistic/js/template-curly-spacing': [2, 'never'], + '@stylistic/js/template-tag-spacing': [2, 'never'], + '@stylistic/js/wrap-iife': [2, 'inside'], + '@stylistic/js/wrap-regex': [0], + '@stylistic/js/yield-star-spacing': [2, 'after'], + 'accessor-pairs': [2], + + 'array-callback-return': [2, { + checkForEach: true, + }], + + 'array-func/avoid-reverse': [2], + 'array-func/from-map': [2], + 'array-func/no-unnecessary-this-arg': [2], + 'array-func/prefer-array-from': [2], + 'array-func/prefer-flat-map': [0], + 'array-func/prefer-flat': [0], + 'arrow-body-style': [0], + 'block-scoped-var': [2], + camelcase: [0], + 'capitalized-comments': [0], + 'class-methods-use-this': [0], + complexity: [0], + 'consistent-return': [0], + 'consistent-this': [0], + 'constructor-super': [2], + curly: [0], + 'default-case-last': [2], + 'default-case': [0], + 'default-param-last': [0], + 'dot-notation': [0], + eqeqeq: [2], + 'for-direction': [2], + 'func-name-matching': [2], + 'func-names': [0], + 'func-style': [0], + 'getter-return': [2], + 'grouped-accessor-pairs': [2], + 'guard-for-in': [0], + 'id-blacklist': [0], + 'id-length': [0], + 'id-match': [0], + 'init-declarations': [0], + 'line-comment-position': [0], + 'logical-assignment-operators': [0], + 'max-classes-per-file': [0], + 'max-depth': [0], + 'max-lines-per-function': [0], + 'max-lines': [0], + 'max-nested-callbacks': [0], + 'max-params': [0], + 'max-statements': [0], + 'multiline-comment-style': [2, 'separate-lines'], + 'new-cap': [0], + 'no-alert': [0], + 'no-array-constructor': [2], + 'no-async-promise-executor': [0], + 'no-await-in-loop': [0], + 'no-bitwise': [0], + 'no-buffer-constructor': [0], + 'no-caller': [2], + 'no-case-declarations': [2], + 'no-class-assign': [2], + 'no-compare-neg-zero': [2], + 'no-cond-assign': [2, 'except-parens'], + + 'no-console': [1, { + allow: ['debug', 'info', 'warn', 'error'], + }], + + 'no-const-assign': [2], + 'no-constant-binary-expression': [2], + 'no-constant-condition': [0], + 'no-constructor-return': [2], + 'no-continue': [0], + 'no-control-regex': [0], + 'no-debugger': [1], + 'no-delete-var': [2], + 'no-div-regex': [0], + 'no-dupe-args': [2], + 'no-dupe-class-members': [2], + 'no-dupe-else-if': [2], + 'no-dupe-keys': [2], + 'no-duplicate-case': [2], + 'no-duplicate-imports': [2], + 'no-else-return': [2], + 'no-empty-character-class': [2], + 'no-empty-function': [0], + 'no-empty-pattern': [2], + 'no-empty-static-block': [2], + + 'no-empty': [2, { + allowEmptyCatch: true, + }], + + 'no-eq-null': [2], + 'no-eval': [2], + 'no-ex-assign': [2], + 'no-extend-native': [2], + 'no-extra-bind': [2], + 'no-extra-boolean-cast': [2], + 'no-extra-label': [0], + 'no-fallthrough': [2], + 'no-func-assign': [2], + 'no-global-assign': [2], + 'no-implicit-coercion': [2], + 'no-implicit-globals': [0], + 'no-implied-eval': [2], + 'no-import-assign': [2], + 'no-inline-comments': [0], + 'no-inner-declarations': [2], + 'no-invalid-regexp': [2], + 'no-invalid-this': [0], + 'no-irregular-whitespace': [2], + 'no-iterator': [2], + 'no-jquery/no-ajax-events': [2], + 'no-jquery/no-ajax': [2], + 'no-jquery/no-and-self': [2], + 'no-jquery/no-animate-toggle': [2], + 'no-jquery/no-animate': [2], + 'no-jquery/no-append-html': [2], + 'no-jquery/no-attr': [2], + 'no-jquery/no-bind': [2], + 'no-jquery/no-box-model': [2], + 'no-jquery/no-browser': [2], + 'no-jquery/no-camel-case': [2], + 'no-jquery/no-class-state': [2], + 'no-jquery/no-class': [0], + 'no-jquery/no-clone': [2], + 'no-jquery/no-closest': [0], + 'no-jquery/no-constructor-attributes': [2], + 'no-jquery/no-contains': [2], + 'no-jquery/no-context-prop': [2], + 'no-jquery/no-css': [2], + 'no-jquery/no-data': [0], + 'no-jquery/no-deferred': [2], + 'no-jquery/no-delegate': [2], + 'no-jquery/no-each-collection': [0], + 'no-jquery/no-each-util': [0], + 'no-jquery/no-each': [0], + 'no-jquery/no-error-shorthand': [2], + 'no-jquery/no-error': [2], + 'no-jquery/no-escape-selector': [2], + 'no-jquery/no-event-shorthand': [2], + 'no-jquery/no-extend': [2], + 'no-jquery/no-fade': [2], + 'no-jquery/no-filter': [0], + 'no-jquery/no-find-collection': [0], + 'no-jquery/no-find-util': [2], + 'no-jquery/no-find': [0], + 'no-jquery/no-fx-interval': [2], + 'no-jquery/no-global-eval': [2], + 'no-jquery/no-global-selector': [0], + 'no-jquery/no-grep': [2], + 'no-jquery/no-has': [2], + 'no-jquery/no-hold-ready': [2], + 'no-jquery/no-html': [0], + 'no-jquery/no-in-array': [2], + 'no-jquery/no-is-array': [2], + 'no-jquery/no-is-empty-object': [2], + 'no-jquery/no-is-function': [2], + 'no-jquery/no-is-numeric': [2], + 'no-jquery/no-is-plain-object': [2], + 'no-jquery/no-is-window': [2], + 'no-jquery/no-is': [2], + 'no-jquery/no-jquery-constructor': [0], + 'no-jquery/no-live': [2], + 'no-jquery/no-load-shorthand': [2], + 'no-jquery/no-load': [2], + 'no-jquery/no-map-collection': [0], + 'no-jquery/no-map-util': [2], + 'no-jquery/no-map': [2], + 'no-jquery/no-merge': [2], + 'no-jquery/no-node-name': [2], + 'no-jquery/no-noop': [2], + 'no-jquery/no-now': [2], + 'no-jquery/no-on-ready': [2], + 'no-jquery/no-other-methods': [0], + 'no-jquery/no-other-utils': [2], + 'no-jquery/no-param': [2], + 'no-jquery/no-parent': [0], + 'no-jquery/no-parents': [2], + 'no-jquery/no-parse-html-literal': [2], + 'no-jquery/no-parse-html': [2], + 'no-jquery/no-parse-json': [2], + 'no-jquery/no-parse-xml': [2], + 'no-jquery/no-prop': [2], + 'no-jquery/no-proxy': [2], + 'no-jquery/no-ready-shorthand': [2], + 'no-jquery/no-ready': [2], + 'no-jquery/no-selector-prop': [2], + 'no-jquery/no-serialize': [2], + 'no-jquery/no-size': [2], + 'no-jquery/no-sizzle': [0], + 'no-jquery/no-slide': [2], + 'no-jquery/no-sub': [2], + 'no-jquery/no-support': [2], + 'no-jquery/no-text': [0], + 'no-jquery/no-trigger': [0], + 'no-jquery/no-trim': [2], + 'no-jquery/no-type': [2], + 'no-jquery/no-unique': [2], + 'no-jquery/no-unload-shorthand': [2], + 'no-jquery/no-val': [0], + 'no-jquery/no-visibility': [2], + 'no-jquery/no-when': [2], + 'no-jquery/no-wrap': [2], + 'no-jquery/variable-pattern': [2], + 'no-label-var': [2], + 'no-labels': [0], + 'no-lone-blocks': [2], + 'no-lonely-if': [0], + 'no-loop-func': [0], + 'no-loss-of-precision': [2], + 'no-magic-numbers': [0], + 'no-misleading-character-class': [2], + 'no-multi-assign': [0], + 'no-multi-str': [2], + 'no-negated-condition': [0], + 'no-nested-ternary': [0], + 'no-new-func': [2], + 'no-new-native-nonconstructor': [2], + 'no-new-object': [2], + 'no-new-symbol': [2], + 'no-new-wrappers': [2], + 'no-new': [0], + 'no-nonoctal-decimal-escape': [2], + 'no-obj-calls': [2], + 'no-octal-escape': [2], + 'no-octal': [2], + 'no-param-reassign': [0], + 'no-plusplus': [0], + 'no-promise-executor-return': [0], + 'no-proto': [2], + 'no-prototype-builtins': [2], + 'no-redeclare': [2], + 'no-regex-spaces': [2], + 'no-restricted-exports': [0], + + 'no-restricted-globals': [ + 2, + 'addEventListener', + 'blur', + 'close', + 'closed', + 'confirm', + 'defaultStatus', + 'defaultstatus', + 'error', + 'event', + 'external', + 'find', + 'focus', + 'frameElement', + 'frames', + 'history', + 'innerHeight', + 'innerWidth', + 'isFinite', + 'isNaN', + 'length', + 'location', + 'locationbar', + 'menubar', + 'moveBy', + 'moveTo', + 'name', + 'onblur', + 'onerror', + 'onfocus', + 'onload', + 'onresize', + 'onunload', + 'open', + 'opener', + 'opera', + 'outerHeight', + 'outerWidth', + 'pageXOffset', + 'pageYOffset', + 'parent', + 'print', + 'removeEventListener', + 'resizeBy', + 'resizeTo', + 'screen', + 'screenLeft', + 'screenTop', + 'screenX', + 'screenY', + 'scroll', + 'scrollbars', + 'scrollBy', + 'scrollTo', + 'scrollX', + 'scrollY', + 'self', + 'status', + 'statusbar', + 'stop', + 'toolbar', + 'top', + '__dirname', + '__filename', + ], + + 'no-restricted-imports': [0], + + 'no-restricted-syntax': [ + 2, + 'WithStatement', + 'ForInStatement', + 'LabeledStatement', + 'SequenceExpression', + { + selector: "CallExpression[callee.name='fetch']", + message: 'use modules/fetch.js instead', + }, + ], + + 'no-return-assign': [0], + 'no-script-url': [2], + + 'no-self-assign': [2, { + props: true, + }], + + 'no-self-compare': [2], + 'no-sequences': [2], + 'no-setter-return': [2], + 'no-shadow-restricted-names': [2], + 'no-shadow': [0], + 'no-sparse-arrays': [2], + 'no-template-curly-in-string': [2], + 'no-ternary': [0], + 'no-this-before-super': [2], + 'no-throw-literal': [2], + 'no-undef-init': [2], + + 'no-undef': [2, { + typeof: true, + }], + + 'no-undefined': [0], + 'no-underscore-dangle': [0], + 'no-unexpected-multiline': [2], + 'no-unmodified-loop-condition': [2], + 'no-unneeded-ternary': [2], + 'no-unreachable-loop': [2], + 'no-unreachable': [2], + 'no-unsafe-finally': [2], + 'no-unsafe-negation': [2], + 'no-unused-expressions': [2], + 'no-unused-labels': [2], + 'no-unused-private-class-members': [2], + + 'no-unused-vars': [2, { + args: 'all', + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + ignoreRestSiblings: false, + }], + + 'no-use-before-define': [2, { + functions: false, + classes: true, + variables: true, + allowNamedExports: true, + }], + + 'no-use-extend-native/no-use-extend-native': [2], + 'no-useless-backreference': [2], + 'no-useless-call': [2], + 'no-useless-catch': [2], + 'no-useless-computed-key': [2], + 'no-useless-concat': [2], + 'no-useless-constructor': [2], + 'no-useless-escape': [2], + 'no-useless-rename': [2], + 'no-useless-return': [2], + 'no-var': [2], + 'no-void': [2], + 'no-warning-comments': [0], + 'no-with': [0], + 'object-shorthand': [2, 'always'], + 'one-var-declaration-per-line': [0], + 'one-var': [0], + 'operator-assignment': [2, 'always'], + 'operator-linebreak': [2, 'after'], + + 'prefer-arrow-callback': [2, { + allowNamedFunctions: true, + allowUnboundThis: true, + }], + + 'prefer-const': [2, { + destructuring: 'all', + ignoreReadBeforeAssign: true, + }], + + 'prefer-destructuring': [0], + 'prefer-exponentiation-operator': [2], + 'prefer-named-capture-group': [0], + 'prefer-numeric-literals': [2], + 'prefer-object-has-own': [2], + 'prefer-object-spread': [2], + + 'prefer-promise-reject-errors': [2, { + allowEmptyReject: false, + }], + + 'prefer-regex-literals': [2], + 'prefer-rest-params': [2], + 'prefer-spread': [2], + 'prefer-template': [2], + radix: [2, 'as-needed'], + 'regexp/confusing-quantifier': [2], + 'regexp/control-character-escape': [2], + 'regexp/hexadecimal-escape': [0], + 'regexp/letter-case': [0], + 'regexp/match-any': [2], + 'regexp/negation': [2], + 'regexp/no-contradiction-with-assertion': [0], + 'regexp/no-control-character': [0], + 'regexp/no-dupe-characters-character-class': [2], + 'regexp/no-dupe-disjunctions': [2], + 'regexp/no-empty-alternative': [2], + 'regexp/no-empty-capturing-group': [2], + 'regexp/no-empty-character-class': [0], + 'regexp/no-empty-group': [2], + 'regexp/no-empty-lookarounds-assertion': [2], + 'regexp/no-empty-string-literal': [2], + 'regexp/no-escape-backspace': [2], + 'regexp/no-extra-lookaround-assertions': [0], + 'regexp/no-invalid-regexp': [2], + 'regexp/no-invisible-character': [2], + 'regexp/no-lazy-ends': [2], + 'regexp/no-legacy-features': [2], + 'regexp/no-misleading-capturing-group': [0], + 'regexp/no-misleading-unicode-character': [0], + 'regexp/no-missing-g-flag': [2], + 'regexp/no-non-standard-flag': [2], + 'regexp/no-obscure-range': [2], + 'regexp/no-octal': [2], + 'regexp/no-optional-assertion': [2], + 'regexp/no-potentially-useless-backreference': [2], + 'regexp/no-standalone-backslash': [2], + 'regexp/no-super-linear-backtracking': [0], + 'regexp/no-super-linear-move': [0], + 'regexp/no-trivially-nested-assertion': [2], + 'regexp/no-trivially-nested-quantifier': [2], + 'regexp/no-unused-capturing-group': [0], + 'regexp/no-useless-assertions': [2], + 'regexp/no-useless-backreference': [2], + 'regexp/no-useless-character-class': [2], + 'regexp/no-useless-dollar-replacements': [2], + 'regexp/no-useless-escape': [2], + 'regexp/no-useless-flag': [2], + 'regexp/no-useless-lazy': [2], + 'regexp/no-useless-non-capturing-group': [2], + 'regexp/no-useless-quantifier': [2], + 'regexp/no-useless-range': [2], + 'regexp/no-useless-set-operand': [2], + 'regexp/no-useless-string-literal': [2], + 'regexp/no-useless-two-nums-quantifier': [2], + 'regexp/no-zero-quantifier': [2], + 'regexp/optimal-lookaround-quantifier': [2], + 'regexp/optimal-quantifier-concatenation': [0], + 'regexp/prefer-character-class': [0], + 'regexp/prefer-d': [0], + 'regexp/prefer-escape-replacement-dollar-char': [0], + 'regexp/prefer-lookaround': [0], + 'regexp/prefer-named-backreference': [0], + 'regexp/prefer-named-capture-group': [0], + 'regexp/prefer-named-replacement': [0], + 'regexp/prefer-plus-quantifier': [2], + 'regexp/prefer-predefined-assertion': [2], + 'regexp/prefer-quantifier': [0], + 'regexp/prefer-question-quantifier': [2], + 'regexp/prefer-range': [2], + 'regexp/prefer-regexp-exec': [2], + 'regexp/prefer-regexp-test': [2], + 'regexp/prefer-result-array-groups': [0], + 'regexp/prefer-set-operation': [2], + 'regexp/prefer-star-quantifier': [2], + 'regexp/prefer-unicode-codepoint-escapes': [2], + 'regexp/prefer-w': [0], + 'regexp/require-unicode-regexp': [0], + 'regexp/simplify-set-operations': [2], + 'regexp/sort-alternatives': [0], + 'regexp/sort-character-class-elements': [0], + 'regexp/sort-flags': [0], + 'regexp/strict': [2], + 'regexp/unicode-escape': [0], + 'regexp/use-ignore-case': [0], + 'require-atomic-updates': [0], + 'require-await': [0], + 'require-unicode-regexp': [0], + 'require-yield': [2], + 'sonarjs/cognitive-complexity': [0], + 'sonarjs/elseif-without-else': [0], + 'sonarjs/max-switch-cases': [0], + 'sonarjs/no-all-duplicated-branches': [2], + 'sonarjs/no-collapsible-if': [0], + 'sonarjs/no-collection-size-mischeck': [2], + 'sonarjs/no-duplicate-string': [0], + 'sonarjs/no-duplicated-branches': [0], + 'sonarjs/no-element-overwrite': [2], + 'sonarjs/no-empty-collection': [2], + 'sonarjs/no-extra-arguments': [2], + 'sonarjs/no-gratuitous-expressions': [2], + 'sonarjs/no-identical-conditions': [2], + 'sonarjs/no-identical-expressions': [2], + 'sonarjs/no-identical-functions': [2, 5], + 'sonarjs/no-ignored-return': [2], + 'sonarjs/no-inverted-boolean-check': [2], + 'sonarjs/no-nested-switch': [0], + 'sonarjs/no-nested-template-literals': [0], + 'sonarjs/no-one-iteration-loop': [2], + 'sonarjs/no-redundant-boolean': [2], + 'sonarjs/no-redundant-jump': [2], + 'sonarjs/no-same-line-conditional': [2], + 'sonarjs/no-small-switch': [0], + 'sonarjs/no-unused-collection': [2], + 'sonarjs/no-use-of-empty-return-value': [2], + 'sonarjs/no-useless-catch': [2], + 'sonarjs/non-existent-operator': [2], + 'sonarjs/prefer-immediate-return': [0], + 'sonarjs/prefer-object-literal': [0], + 'sonarjs/prefer-single-boolean-return': [0], + 'sonarjs/prefer-while': [2], + 'sort-imports': [0], + 'sort-keys': [0], + 'sort-vars': [0], + strict: [0], + 'symbol-description': [2], + 'unicode-bom': [2, 'never'], + 'unicorn/better-regex': [0], + 'unicorn/catch-error-name': [0], + 'unicorn/consistent-destructuring': [2], + 'unicorn/consistent-empty-array-spread': [2], + 'unicorn/consistent-existence-index-check': [2], + 'unicorn/consistent-function-scoping': [2], + 'unicorn/custom-error-definition': [0], + 'unicorn/empty-brace-spaces': [2], + 'unicorn/error-message': [0], + 'unicorn/escape-case': [0], + 'unicorn/expiring-todo-comments': [0], + 'unicorn/explicit-length-check': [0], + 'unicorn/filename-case': [0], + 'unicorn/import-index': [0], + 'unicorn/import-style': [0], + 'unicorn/new-for-builtins': [2], + 'unicorn/no-abusive-eslint-disable': [0], + 'unicorn/no-anonymous-default-export': [0], + 'unicorn/no-array-callback-reference': [0], + 'unicorn/no-array-for-each': [2], + 'unicorn/no-array-method-this-argument': [2], + 'unicorn/no-array-push-push': [2], + 'unicorn/no-array-reduce': [2], + 'unicorn/no-await-expression-member': [0], + 'unicorn/no-await-in-promise-methods': [2], + 'unicorn/no-console-spaces': [0], + 'unicorn/no-document-cookie': [2], + 'unicorn/no-empty-file': [2], + 'unicorn/no-for-loop': [0], + 'unicorn/no-hex-escape': [0], + 'unicorn/no-instanceof-array': [0], + 'unicorn/no-invalid-fetch-options': [2], + 'unicorn/no-invalid-remove-event-listener': [2], + 'unicorn/no-keyword-prefix': [0], + 'unicorn/no-length-as-slice-end': [2], + 'unicorn/no-lonely-if': [2], + 'unicorn/no-magic-array-flat-depth': [0], + 'unicorn/no-negated-condition': [0], + 'unicorn/no-negation-in-equality-check': [2], + 'unicorn/no-nested-ternary': [0], + 'unicorn/no-new-array': [0], + 'unicorn/no-new-buffer': [0], + 'unicorn/no-null': [0], + 'unicorn/no-object-as-default-parameter': [0], + 'unicorn/no-process-exit': [0], + 'unicorn/no-single-promise-in-promise-methods': [2], + 'unicorn/no-static-only-class': [2], + 'unicorn/no-thenable': [2], + 'unicorn/no-this-assignment': [2], + 'unicorn/no-typeof-undefined': [2], + 'unicorn/no-unnecessary-await': [2], + 'unicorn/no-unnecessary-polyfills': [2], + 'unicorn/no-unreadable-array-destructuring': [0], + 'unicorn/no-unreadable-iife': [2], + 'unicorn/no-unused-properties': [2], + 'unicorn/no-useless-fallback-in-spread': [2], + 'unicorn/no-useless-length-check': [2], + 'unicorn/no-useless-promise-resolve-reject': [2], + 'unicorn/no-useless-spread': [2], + 'unicorn/no-useless-switch-case': [2], + 'unicorn/no-useless-undefined': [0], + 'unicorn/no-zero-fractions': [2], + 'unicorn/number-literal-case': [0], + 'unicorn/numeric-separators-style': [0], + 'unicorn/prefer-add-event-listener': [2], + 'unicorn/prefer-array-find': [2], + 'unicorn/prefer-array-flat-map': [2], + 'unicorn/prefer-array-flat': [2], + 'unicorn/prefer-array-index-of': [2], + 'unicorn/prefer-array-some': [2], + 'unicorn/prefer-at': [0], + 'unicorn/prefer-blob-reading-methods': [2], + 'unicorn/prefer-code-point': [0], + 'unicorn/prefer-date-now': [2], + 'unicorn/prefer-default-parameters': [0], + 'unicorn/prefer-dom-node-append': [2], + 'unicorn/prefer-dom-node-dataset': [0], + 'unicorn/prefer-dom-node-remove': [2], + 'unicorn/prefer-dom-node-text-content': [2], + 'unicorn/prefer-event-target': [2], + 'unicorn/prefer-export-from': [0], + 'unicorn/prefer-global-this': [0], + 'unicorn/prefer-includes': [2], + 'unicorn/prefer-json-parse-buffer': [0], + 'unicorn/prefer-keyboard-event-key': [2], + 'unicorn/prefer-logical-operator-over-ternary': [2], + 'unicorn/prefer-math-min-max': [2], + 'unicorn/prefer-math-trunc': [2], + 'unicorn/prefer-modern-dom-apis': [0], + 'unicorn/prefer-modern-math-apis': [2], + 'unicorn/prefer-module': [2], + 'unicorn/prefer-native-coercion-functions': [2], + 'unicorn/prefer-negative-index': [2], + 'unicorn/prefer-node-protocol': [2], + 'unicorn/prefer-number-properties': [0], + 'unicorn/prefer-object-from-entries': [2], + 'unicorn/prefer-object-has-own': [0], + 'unicorn/prefer-optional-catch-binding': [2], + 'unicorn/prefer-prototype-methods': [0], + 'unicorn/prefer-query-selector': [0], + 'unicorn/prefer-reflect-apply': [0], + 'unicorn/prefer-regexp-test': [2], + 'unicorn/prefer-set-has': [0], + 'unicorn/prefer-set-size': [2], + 'unicorn/prefer-spread': [0], + 'unicorn/prefer-string-raw': [0], + 'unicorn/prefer-string-replace-all': [0], + 'unicorn/prefer-string-slice': [0], + 'unicorn/prefer-string-starts-ends-with': [2], + 'unicorn/prefer-string-trim-start-end': [2], + 'unicorn/prefer-structured-clone': [2], + 'unicorn/prefer-switch': [0], + 'unicorn/prefer-ternary': [0], + 'unicorn/prefer-text-content': [2], + 'unicorn/prefer-top-level-await': [0], + 'unicorn/prefer-type-error': [0], + 'unicorn/prevent-abbreviations': [0], + 'unicorn/relative-url-style': [2], + 'unicorn/require-array-join-separator': [2], + 'unicorn/require-number-to-fixed-digits-argument': [2], + 'unicorn/require-post-message-target-origin': [0], + 'unicorn/string-content': [0], + 'unicorn/switch-case-braces': [0], + 'unicorn/template-indent': [2], + 'unicorn/text-encoding-identifier-case': [0], + 'unicorn/throw-new-error': [2], + 'use-isnan': [2], + + 'valid-typeof': [2, { + requireStringLiterals: true, + }], + + 'vars-on-top': [0], + 'wc/attach-shadow-constructor': [2], + 'wc/define-tag-after-class-definition': [0], + 'wc/expose-class-on-global': [0], + 'wc/file-name-matches-element': [2], + 'wc/guard-define-call': [0], + 'wc/guard-super-call': [2], + 'wc/max-elements-per-file': [0], + 'wc/no-child-traversal-in-attributechangedcallback': [2], + 'wc/no-child-traversal-in-connectedcallback': [2], + 'wc/no-closed-shadow-root': [2], + 'wc/no-constructor-attributes': [2], + 'wc/no-constructor-params': [2], + 'wc/no-constructor': [2], + 'wc/no-customized-built-in-elements': [2], + 'wc/no-exports-with-element': [0], + 'wc/no-invalid-element-name': [2], + 'wc/no-invalid-extends': [2], + 'wc/no-method-prefixed-with-on': [2], + 'wc/no-self-class': [2], + 'wc/no-typos': [2], + 'wc/require-listener-teardown': [2], + 'wc/tag-name-matches-class': [2], + yoda: [2, 'never'], + }, + }, + { + ignores: ['*.vue', '**/*.vue'], + rules: { + 'import-x/consistent-type-specifier-style': [0], + 'import-x/default': [0], + 'import-x/dynamic-import-chunkname': [0], + 'import-x/export': [2], + 'import-x/exports-last': [0], + + 'import-x/extensions': [2, 'always', { + ignorePackages: true, + }], + + 'import-x/first': [2], + 'import-x/group-exports': [0], + 'import-x/max-dependencies': [0], + 'import-x/named': [2], + 'import-x/namespace': [0], + 'import-x/newline-after-import': [0], + 'import-x/no-absolute-path': [0], + 'import-x/no-amd': [2], + 'import-x/no-anonymous-default-export': [0], + 'import-x/no-commonjs': [2], + + 'import-x/no-cycle': [2, { + ignoreExternal: true, + maxDepth: 1, + }], + + 'import-x/no-default-export': [0], + 'import-x/no-deprecated': [0], + 'import-x/no-dynamic-require': [0], + 'import-x/no-empty-named-blocks': [2], + 'import-x/no-extraneous-dependencies': [2], + 'import-x/no-import-module-exports': [0], + 'import-x/no-internal-modules': [0], + 'import-x/no-mutable-exports': [0], + 'import-x/no-named-as-default-member': [0], + 'import-x/no-named-as-default': [2], + 'import-x/no-named-default': [0], + 'import-x/no-named-export': [0], + 'import-x/no-namespace': [0], + 'import-x/no-nodejs-modules': [0], + 'import-x/no-relative-packages': [0], + 'import-x/no-relative-parent-imports': [0], + 'import-x/no-restricted-paths': [0], + 'import-x/no-self-import': [2], + 'import-x/no-unassigned-import': [0], + + 'import-x/no-unresolved': [2, { + commonjs: true, + ignore: ['\\?.+$', '^vitest/'], + }], + + 'import-x/no-useless-path-segments': [2, { + commonjs: true, + }], + + 'import-x/no-webpack-loader-syntax': [2], + 'import-x/order': [0], + 'import-x/prefer-default-export': [0], + 'import-x/unambiguous': [0], + }, + }, + { + files: ['web_src/**/*'], + languageOptions: { + globals: { + __webpack_public_path__: true, + process: false, + }, + }, + }, { + files: ['web_src/**/*', 'docs/**/*'], + + languageOptions: { + globals: { + ...globals.browser, + }, + }, + }, { + files: ['web_src/**/*worker.*'], + + languageOptions: { + globals: { + ...globals.worker, + }, + }, + + rules: { + 'no-restricted-globals': [ + 2, + 'addEventListener', + 'blur', + 'close', + 'closed', + 'confirm', + 'defaultStatus', + 'defaultstatus', + 'error', + 'event', + 'external', + 'find', + 'focus', + 'frameElement', + 'frames', + 'history', + 'innerHeight', + 'innerWidth', + 'isFinite', + 'isNaN', + 'length', + 'locationbar', + 'menubar', + 'moveBy', + 'moveTo', + 'name', + 'onblur', + 'onerror', + 'onfocus', + 'onload', + 'onresize', + 'onunload', + 'open', + 'opener', + 'opera', + 'outerHeight', + 'outerWidth', + 'pageXOffset', + 'pageYOffset', + 'parent', + 'print', + 'removeEventListener', + 'resizeBy', + 'resizeTo', + 'screen', + 'screenLeft', + 'screenTop', + 'screenX', + 'screenY', + 'scroll', + 'scrollbars', + 'scrollBy', + 'scrollTo', + 'scrollX', + 'scrollY', + 'status', + 'statusbar', + 'stop', + 'toolbar', + 'top', + ], + }, + }, { + files: ['**/*.config.*'], + languageOptions: { ecmaVersion: 'latest', }, - - ecmaVersion: 'latest', - sourceType: 'module', - }, - rules: { - '@eslint-community/eslint-comments/disable-enable-pair': [2], - '@eslint-community/eslint-comments/no-aggregating-enable': [2], - '@eslint-community/eslint-comments/no-duplicate-disable': [2], - '@eslint-community/eslint-comments/no-restricted-disable': [0], - '@eslint-community/eslint-comments/no-unlimited-disable': [2], - '@eslint-community/eslint-comments/no-unused-disable': [2], - '@eslint-community/eslint-comments/no-unused-enable': [2], - '@eslint-community/eslint-comments/no-use': [0], - '@eslint-community/eslint-comments/require-description': [0], - '@stylistic/js/array-bracket-newline': [0], - '@stylistic/js/array-bracket-spacing': [2, 'never'], - '@stylistic/js/array-element-newline': [0], - '@stylistic/js/arrow-parens': [2, 'always'], - - '@stylistic/js/arrow-spacing': [2, { - before: true, - after: true, - }], - - '@stylistic/js/block-spacing': [0], - - '@stylistic/js/brace-style': [2, '1tbs', { - allowSingleLine: true, - }], - - '@stylistic/js/comma-dangle': [2, 'always-multiline'], - - '@stylistic/js/comma-spacing': [2, { - before: false, - after: true, - }], - - '@stylistic/js/comma-style': [2, 'last'], - '@stylistic/js/computed-property-spacing': [2, 'never'], - '@stylistic/js/dot-location': [2, 'property'], - '@stylistic/js/eol-last': [2], - '@stylistic/js/function-call-spacing': [2, 'never'], - '@stylistic/js/function-call-argument-newline': [0], - '@stylistic/js/function-paren-newline': [0], - '@stylistic/js/generator-star-spacing': [0], - '@stylistic/js/implicit-arrow-linebreak': [0], - - '@stylistic/js/indent': [2, 2, { - ignoreComments: true, - SwitchCase: 1, - }], - - '@stylistic/js/key-spacing': [2], - '@stylistic/js/keyword-spacing': [2], - '@stylistic/js/linebreak-style': [2, 'unix'], - '@stylistic/js/lines-around-comment': [0], - '@stylistic/js/lines-between-class-members': [0], - '@stylistic/js/max-len': [0], - '@stylistic/js/max-statements-per-line': [0], - '@stylistic/js/multiline-ternary': [0], - '@stylistic/js/new-parens': [2], - '@stylistic/js/newline-per-chained-call': [0], - '@stylistic/js/no-confusing-arrow': [0], - '@stylistic/js/no-extra-parens': [0], - '@stylistic/js/no-extra-semi': [2], - '@stylistic/js/no-floating-decimal': [0], - '@stylistic/js/no-mixed-operators': [0], - '@stylistic/js/no-mixed-spaces-and-tabs': [2], - - '@stylistic/js/no-multi-spaces': [2, { - ignoreEOLComments: true, - - exceptions: { - Property: true, + rules: { + 'import-x/no-unused-modules': [0], + 'import-x/no-unresolved': [0], + 'import-x/no-named-as-default': [0], + }, + }, { + files: ['**/*.test.*', 'web_src/js/test/setup.js'], + languageOptions: { + globals: { + ...vitestGlobals.environments.env.globals, }, - }], + }, - '@stylistic/js/no-multiple-empty-lines': [2, { - max: 1, - maxEOF: 0, - maxBOF: 0, - }], + rules: { + '@vitest/consistent-test-filename': [0], + '@vitest/consistent-test-it': [0], + '@vitest/expect-expect': [0], + '@vitest/max-expects': [0], + '@vitest/max-nested-describe': [0], + '@vitest/no-alias-methods': [0], + '@vitest/no-commented-out-tests': [0], + '@vitest/no-conditional-expect': [0], + '@vitest/no-conditional-in-test': [0], + '@vitest/no-conditional-tests': [0], + '@vitest/no-disabled-tests': [0], + '@vitest/no-done-callback': [0], + '@vitest/no-duplicate-hooks': [0], + '@vitest/no-focused-tests': [0], + '@vitest/no-hooks': [0], + '@vitest/no-identical-title': [2], + '@vitest/no-interpolation-in-snapshots': [0], + '@vitest/no-large-snapshots': [0], + '@vitest/no-mocks-import': [0], + '@vitest/no-restricted-matchers': [0], + '@vitest/no-restricted-vi-methods': [0], + '@vitest/no-standalone-expect': [0], + '@vitest/no-test-prefixes': [0], + '@vitest/no-test-return-statement': [0], + '@vitest/prefer-called-with': [0], + '@vitest/prefer-comparison-matcher': [0], + '@vitest/prefer-each': [0], + '@vitest/prefer-equality-matcher': [0], + '@vitest/prefer-expect-resolves': [0], + '@vitest/prefer-hooks-in-order': [0], + '@vitest/prefer-hooks-on-top': [2], + '@vitest/prefer-lowercase-title': [0], + '@vitest/prefer-mock-promise-shorthand': [0], + '@vitest/prefer-snapshot-hint': [0], + '@vitest/prefer-spy-on': [0], + '@vitest/prefer-strict-equal': [0], + '@vitest/prefer-to-be': [0], + '@vitest/prefer-to-be-falsy': [0], + '@vitest/prefer-to-be-object': [0], + '@vitest/prefer-to-be-truthy': [0], + '@vitest/prefer-to-contain': [0], + '@vitest/prefer-to-have-length': [0], + '@vitest/prefer-todo': [0], + '@vitest/require-hook': [0], + '@vitest/require-to-throw-message': [0], + '@vitest/require-top-level-describe': [0], + '@vitest/valid-describe-callback': [2], + '@vitest/valid-expect': [2], + '@vitest/valid-title': [2], + }, + }, { + files: ['web_src/js/modules/fetch.js', 'web_src/js/standalone/**/*'], - '@stylistic/js/no-tabs': [2], - '@stylistic/js/no-trailing-spaces': [2], - '@stylistic/js/no-whitespace-before-property': [2], - '@stylistic/js/nonblock-statement-body-position': [2], - '@stylistic/js/object-curly-newline': [0], - '@stylistic/js/object-curly-spacing': [2, 'never'], - '@stylistic/js/object-property-newline': [0], - '@stylistic/js/one-var-declaration-per-line': [0], - '@stylistic/js/operator-linebreak': [2, 'after'], - '@stylistic/js/padded-blocks': [2, 'never'], - '@stylistic/js/padding-line-between-statements': [0], - '@stylistic/js/quote-props': [0], - - '@stylistic/js/quotes': [2, 'single', { - avoidEscape: true, - allowTemplateLiterals: true, - }], - - '@stylistic/js/rest-spread-spacing': [2, 'never'], - - '@stylistic/js/semi': [2, 'always', { - omitLastInOneLineBlock: true, - }], - - '@stylistic/js/semi-spacing': [2, { - before: false, - after: true, - }], - - '@stylistic/js/semi-style': [2, 'last'], - '@stylistic/js/space-before-blocks': [2, 'always'], - - '@stylistic/js/space-before-function-paren': [2, { - anonymous: 'ignore', - named: 'never', - asyncArrow: 'always', - }], - - '@stylistic/js/space-in-parens': [2, 'never'], - '@stylistic/js/space-infix-ops': [2], - '@stylistic/js/space-unary-ops': [2], - '@stylistic/js/spaced-comment': [2, 'always'], - '@stylistic/js/switch-colon-spacing': [2], - '@stylistic/js/template-curly-spacing': [2, 'never'], - '@stylistic/js/template-tag-spacing': [2, 'never'], - '@stylistic/js/wrap-iife': [2, 'inside'], - '@stylistic/js/wrap-regex': [0], - '@stylistic/js/yield-star-spacing': [2, 'after'], - 'accessor-pairs': [2], - - 'array-callback-return': [2, { - checkForEach: true, - }], - - 'array-func/avoid-reverse': [2], - 'array-func/from-map': [2], - 'array-func/no-unnecessary-this-arg': [2], - 'array-func/prefer-array-from': [2], - 'array-func/prefer-flat-map': [0], - 'array-func/prefer-flat': [0], - 'arrow-body-style': [0], - 'block-scoped-var': [2], - camelcase: [0], - 'capitalized-comments': [0], - 'class-methods-use-this': [0], - complexity: [0], - 'consistent-return': [0], - 'consistent-this': [0], - 'constructor-super': [2], - curly: [0], - 'default-case-last': [2], - 'default-case': [0], - 'default-param-last': [0], - 'dot-notation': [0], - eqeqeq: [2], - 'for-direction': [2], - 'func-name-matching': [2], - 'func-names': [0], - 'func-style': [0], - 'getter-return': [2], - 'grouped-accessor-pairs': [2], - 'guard-for-in': [0], - 'id-blacklist': [0], - 'id-length': [0], - 'id-match': [0], - 'init-declarations': [0], - 'line-comment-position': [0], - 'logical-assignment-operators': [0], - 'max-classes-per-file': [0], - 'max-depth': [0], - 'max-lines-per-function': [0], - 'max-lines': [0], - 'max-nested-callbacks': [0], - 'max-params': [0], - 'max-statements': [0], - 'multiline-comment-style': [2, 'separate-lines'], - 'new-cap': [0], - 'no-alert': [0], - 'no-array-constructor': [2], - 'no-async-promise-executor': [0], - 'no-await-in-loop': [0], - 'no-bitwise': [0], - 'no-buffer-constructor': [0], - 'no-caller': [2], - 'no-case-declarations': [2], - 'no-class-assign': [2], - 'no-compare-neg-zero': [2], - 'no-cond-assign': [2, 'except-parens'], - - 'no-console': [1, { - allow: ['debug', 'info', 'warn', 'error'], - }], - - 'no-const-assign': [2], - 'no-constant-binary-expression': [2], - 'no-constant-condition': [0], - 'no-constructor-return': [2], - 'no-continue': [0], - 'no-control-regex': [0], - 'no-debugger': [1], - 'no-delete-var': [2], - 'no-div-regex': [0], - 'no-dupe-args': [2], - 'no-dupe-class-members': [2], - 'no-dupe-else-if': [2], - 'no-dupe-keys': [2], - 'no-duplicate-case': [2], - 'no-duplicate-imports': [2], - 'no-else-return': [2], - 'no-empty-character-class': [2], - 'no-empty-function': [0], - 'no-empty-pattern': [2], - 'no-empty-static-block': [2], - - 'no-empty': [2, { - allowEmptyCatch: true, - }], - - 'no-eq-null': [2], - 'no-eval': [2], - 'no-ex-assign': [2], - 'no-extend-native': [2], - 'no-extra-bind': [2], - 'no-extra-boolean-cast': [2], - 'no-extra-label': [0], - 'no-fallthrough': [2], - 'no-func-assign': [2], - 'no-global-assign': [2], - 'no-implicit-coercion': [2], - 'no-implicit-globals': [0], - 'no-implied-eval': [2], - 'no-import-assign': [2], - 'no-inline-comments': [0], - 'no-inner-declarations': [2], - 'no-invalid-regexp': [2], - 'no-invalid-this': [0], - 'no-irregular-whitespace': [2], - 'no-iterator': [2], - 'no-jquery/no-ajax-events': [2], - 'no-jquery/no-ajax': [2], - 'no-jquery/no-and-self': [2], - 'no-jquery/no-animate-toggle': [2], - 'no-jquery/no-animate': [2], - 'no-jquery/no-append-html': [2], - 'no-jquery/no-attr': [2], - 'no-jquery/no-bind': [2], - 'no-jquery/no-box-model': [2], - 'no-jquery/no-browser': [2], - 'no-jquery/no-camel-case': [2], - 'no-jquery/no-class-state': [2], - 'no-jquery/no-class': [0], - 'no-jquery/no-clone': [2], - 'no-jquery/no-closest': [0], - 'no-jquery/no-constructor-attributes': [2], - 'no-jquery/no-contains': [2], - 'no-jquery/no-context-prop': [2], - 'no-jquery/no-css': [2], - 'no-jquery/no-data': [0], - 'no-jquery/no-deferred': [2], - 'no-jquery/no-delegate': [2], - 'no-jquery/no-each-collection': [0], - 'no-jquery/no-each-util': [0], - 'no-jquery/no-each': [0], - 'no-jquery/no-error-shorthand': [2], - 'no-jquery/no-error': [2], - 'no-jquery/no-escape-selector': [2], - 'no-jquery/no-event-shorthand': [2], - 'no-jquery/no-extend': [2], - 'no-jquery/no-fade': [2], - 'no-jquery/no-filter': [0], - 'no-jquery/no-find-collection': [0], - 'no-jquery/no-find-util': [2], - 'no-jquery/no-find': [0], - 'no-jquery/no-fx-interval': [2], - 'no-jquery/no-global-eval': [2], - 'no-jquery/no-global-selector': [0], - 'no-jquery/no-grep': [2], - 'no-jquery/no-has': [2], - 'no-jquery/no-hold-ready': [2], - 'no-jquery/no-html': [0], - 'no-jquery/no-in-array': [2], - 'no-jquery/no-is-array': [2], - 'no-jquery/no-is-empty-object': [2], - 'no-jquery/no-is-function': [2], - 'no-jquery/no-is-numeric': [2], - 'no-jquery/no-is-plain-object': [2], - 'no-jquery/no-is-window': [2], - 'no-jquery/no-is': [2], - 'no-jquery/no-jquery-constructor': [0], - 'no-jquery/no-live': [2], - 'no-jquery/no-load-shorthand': [2], - 'no-jquery/no-load': [2], - 'no-jquery/no-map-collection': [0], - 'no-jquery/no-map-util': [2], - 'no-jquery/no-map': [2], - 'no-jquery/no-merge': [2], - 'no-jquery/no-node-name': [2], - 'no-jquery/no-noop': [2], - 'no-jquery/no-now': [2], - 'no-jquery/no-on-ready': [2], - 'no-jquery/no-other-methods': [0], - 'no-jquery/no-other-utils': [2], - 'no-jquery/no-param': [2], - 'no-jquery/no-parent': [0], - 'no-jquery/no-parents': [2], - 'no-jquery/no-parse-html-literal': [2], - 'no-jquery/no-parse-html': [2], - 'no-jquery/no-parse-json': [2], - 'no-jquery/no-parse-xml': [2], - 'no-jquery/no-prop': [2], - 'no-jquery/no-proxy': [2], - 'no-jquery/no-ready-shorthand': [2], - 'no-jquery/no-ready': [2], - 'no-jquery/no-selector-prop': [2], - 'no-jquery/no-serialize': [2], - 'no-jquery/no-size': [2], - 'no-jquery/no-sizzle': [0], - 'no-jquery/no-slide': [2], - 'no-jquery/no-sub': [2], - 'no-jquery/no-support': [2], - 'no-jquery/no-text': [0], - 'no-jquery/no-trigger': [0], - 'no-jquery/no-trim': [2], - 'no-jquery/no-type': [2], - 'no-jquery/no-unique': [2], - 'no-jquery/no-unload-shorthand': [2], - 'no-jquery/no-val': [0], - 'no-jquery/no-visibility': [2], - 'no-jquery/no-when': [2], - 'no-jquery/no-wrap': [2], - 'no-jquery/variable-pattern': [2], - 'no-label-var': [2], - 'no-labels': [0], - 'no-lone-blocks': [2], - 'no-lonely-if': [0], - 'no-loop-func': [0], - 'no-loss-of-precision': [2], - 'no-magic-numbers': [0], - 'no-misleading-character-class': [2], - 'no-multi-assign': [0], - 'no-multi-str': [2], - 'no-negated-condition': [0], - 'no-nested-ternary': [0], - 'no-new-func': [2], - 'no-new-native-nonconstructor': [2], - 'no-new-object': [2], - 'no-new-symbol': [2], - 'no-new-wrappers': [2], - 'no-new': [0], - 'no-nonoctal-decimal-escape': [2], - 'no-obj-calls': [2], - 'no-octal-escape': [2], - 'no-octal': [2], - 'no-param-reassign': [0], - 'no-plusplus': [0], - 'no-promise-executor-return': [0], - 'no-proto': [2], - 'no-prototype-builtins': [2], - 'no-redeclare': [2], - 'no-regex-spaces': [2], - 'no-restricted-exports': [0], - - 'no-restricted-globals': [ - 2, - 'addEventListener', - 'blur', - 'close', - 'closed', - 'confirm', - 'defaultStatus', - 'defaultstatus', - 'error', - 'event', - 'external', - 'find', - 'focus', - 'frameElement', - 'frames', - 'history', - 'innerHeight', - 'innerWidth', - 'isFinite', - 'isNaN', - 'length', - 'location', - 'locationbar', - 'menubar', - 'moveBy', - 'moveTo', - 'name', - 'onblur', - 'onerror', - 'onfocus', - 'onload', - 'onresize', - 'onunload', - 'open', - 'opener', - 'opera', - 'outerHeight', - 'outerWidth', - 'pageXOffset', - 'pageYOffset', - 'parent', - 'print', - 'removeEventListener', - 'resizeBy', - 'resizeTo', - 'screen', - 'screenLeft', - 'screenTop', - 'screenX', - 'screenY', - 'scroll', - 'scrollbars', - 'scrollBy', - 'scrollTo', - 'scrollX', - 'scrollY', - 'self', - 'status', - 'statusbar', - 'stop', - 'toolbar', - 'top', - '__dirname', - '__filename', - ], - - 'no-restricted-imports': [0], - - 'no-restricted-syntax': [ - 2, - 'WithStatement', - 'ForInStatement', - 'LabeledStatement', - 'SequenceExpression', - { - selector: "CallExpression[callee.name='fetch']", - message: 'use modules/fetch.js instead', + rules: { + 'no-restricted-syntax': [ + 2, + 'WithStatement', + 'ForInStatement', + 'LabeledStatement', + 'SequenceExpression', + ], + }, + }, { + files: ['tests/e2e/**/*.js', 'tests/e2e/**/*.ts'], + languageOptions: { + globals: { + ...globals.browser, }, - ], - 'no-return-assign': [0], - 'no-script-url': [2], + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + ...playwright.configs['flat/recommended'].rules, + 'playwright/no-conditional-in-test': [0], + 'playwright/no-conditional-expect': [0], + 'playwright/no-networkidle': [0], - 'no-self-assign': [2, { - props: true, - }], + 'playwright/no-skipped-test': [ + 2, + { + allowConditional: true, + }, + ], + 'playwright/no-useless-await': [2], - 'no-self-compare': [2], - 'no-sequences': [2], - 'no-setter-return': [2], - 'no-shadow-restricted-names': [2], - 'no-shadow': [0], - 'no-sparse-arrays': [2], - 'no-template-curly-in-string': [2], - 'no-ternary': [0], - 'no-this-before-super': [2], - 'no-throw-literal': [2], - 'no-undef-init': [2], - - 'no-undef': [2, { - typeof: true, - }], - - 'no-undefined': [0], - 'no-underscore-dangle': [0], - 'no-unexpected-multiline': [2], - 'no-unmodified-loop-condition': [2], - 'no-unneeded-ternary': [2], - 'no-unreachable-loop': [2], - 'no-unreachable': [2], - 'no-unsafe-finally': [2], - 'no-unsafe-negation': [2], - 'no-unused-expressions': [2], - 'no-unused-labels': [2], - 'no-unused-private-class-members': [2], - - 'no-unused-vars': [2, { - args: 'all', - argsIgnorePattern: '^_', - varsIgnorePattern: '^_', - caughtErrorsIgnorePattern: '^_', - destructuredArrayIgnorePattern: '^_', - ignoreRestSiblings: false, - }], - - 'no-use-before-define': [2, { - functions: false, - classes: true, - variables: true, - allowNamedExports: true, - }], - - 'no-use-extend-native/no-use-extend-native': [2], - 'no-useless-backreference': [2], - 'no-useless-call': [2], - 'no-useless-catch': [2], - 'no-useless-computed-key': [2], - 'no-useless-concat': [2], - 'no-useless-constructor': [2], - 'no-useless-escape': [2], - 'no-useless-rename': [2], - 'no-useless-return': [2], - 'no-var': [2], - 'no-void': [2], - 'no-warning-comments': [0], - 'no-with': [0], - 'object-shorthand': [2, 'always'], - 'one-var-declaration-per-line': [0], - 'one-var': [0], - 'operator-assignment': [2, 'always'], - 'operator-linebreak': [2, 'after'], - - 'prefer-arrow-callback': [2, { - allowNamedFunctions: true, - allowUnboundThis: true, - }], - - 'prefer-const': [2, { - destructuring: 'all', - ignoreReadBeforeAssign: true, - }], - - 'prefer-destructuring': [0], - 'prefer-exponentiation-operator': [2], - 'prefer-named-capture-group': [0], - 'prefer-numeric-literals': [2], - 'prefer-object-has-own': [2], - 'prefer-object-spread': [2], - - 'prefer-promise-reject-errors': [2, { - allowEmptyReject: false, - }], - - 'prefer-regex-literals': [2], - 'prefer-rest-params': [2], - 'prefer-spread': [2], - 'prefer-template': [2], - radix: [2, 'as-needed'], - 'regexp/confusing-quantifier': [2], - 'regexp/control-character-escape': [2], - 'regexp/hexadecimal-escape': [0], - 'regexp/letter-case': [0], - 'regexp/match-any': [2], - 'regexp/negation': [2], - 'regexp/no-contradiction-with-assertion': [0], - 'regexp/no-control-character': [0], - 'regexp/no-dupe-characters-character-class': [2], - 'regexp/no-dupe-disjunctions': [2], - 'regexp/no-empty-alternative': [2], - 'regexp/no-empty-capturing-group': [2], - 'regexp/no-empty-character-class': [0], - 'regexp/no-empty-group': [2], - 'regexp/no-empty-lookarounds-assertion': [2], - 'regexp/no-empty-string-literal': [2], - 'regexp/no-escape-backspace': [2], - 'regexp/no-extra-lookaround-assertions': [0], - 'regexp/no-invalid-regexp': [2], - 'regexp/no-invisible-character': [2], - 'regexp/no-lazy-ends': [2], - 'regexp/no-legacy-features': [2], - 'regexp/no-misleading-capturing-group': [0], - 'regexp/no-misleading-unicode-character': [0], - 'regexp/no-missing-g-flag': [2], - 'regexp/no-non-standard-flag': [2], - 'regexp/no-obscure-range': [2], - 'regexp/no-octal': [2], - 'regexp/no-optional-assertion': [2], - 'regexp/no-potentially-useless-backreference': [2], - 'regexp/no-standalone-backslash': [2], - 'regexp/no-super-linear-backtracking': [0], - 'regexp/no-super-linear-move': [0], - 'regexp/no-trivially-nested-assertion': [2], - 'regexp/no-trivially-nested-quantifier': [2], - 'regexp/no-unused-capturing-group': [0], - 'regexp/no-useless-assertions': [2], - 'regexp/no-useless-backreference': [2], - 'regexp/no-useless-character-class': [2], - 'regexp/no-useless-dollar-replacements': [2], - 'regexp/no-useless-escape': [2], - 'regexp/no-useless-flag': [2], - 'regexp/no-useless-lazy': [2], - 'regexp/no-useless-non-capturing-group': [2], - 'regexp/no-useless-quantifier': [2], - 'regexp/no-useless-range': [2], - 'regexp/no-useless-set-operand': [2], - 'regexp/no-useless-string-literal': [2], - 'regexp/no-useless-two-nums-quantifier': [2], - 'regexp/no-zero-quantifier': [2], - 'regexp/optimal-lookaround-quantifier': [2], - 'regexp/optimal-quantifier-concatenation': [0], - 'regexp/prefer-character-class': [0], - 'regexp/prefer-d': [0], - 'regexp/prefer-escape-replacement-dollar-char': [0], - 'regexp/prefer-lookaround': [0], - 'regexp/prefer-named-backreference': [0], - 'regexp/prefer-named-capture-group': [0], - 'regexp/prefer-named-replacement': [0], - 'regexp/prefer-plus-quantifier': [2], - 'regexp/prefer-predefined-assertion': [2], - 'regexp/prefer-quantifier': [0], - 'regexp/prefer-question-quantifier': [2], - 'regexp/prefer-range': [2], - 'regexp/prefer-regexp-exec': [2], - 'regexp/prefer-regexp-test': [2], - 'regexp/prefer-result-array-groups': [0], - 'regexp/prefer-set-operation': [2], - 'regexp/prefer-star-quantifier': [2], - 'regexp/prefer-unicode-codepoint-escapes': [2], - 'regexp/prefer-w': [0], - 'regexp/require-unicode-regexp': [0], - 'regexp/simplify-set-operations': [2], - 'regexp/sort-alternatives': [0], - 'regexp/sort-character-class-elements': [0], - 'regexp/sort-flags': [0], - 'regexp/strict': [2], - 'regexp/unicode-escape': [0], - 'regexp/use-ignore-case': [0], - 'require-atomic-updates': [0], - 'require-await': [0], - 'require-unicode-regexp': [0], - 'require-yield': [2], - 'sonarjs/cognitive-complexity': [0], - 'sonarjs/elseif-without-else': [0], - 'sonarjs/max-switch-cases': [0], - 'sonarjs/no-all-duplicated-branches': [2], - 'sonarjs/no-collapsible-if': [0], - 'sonarjs/no-collection-size-mischeck': [2], - 'sonarjs/no-duplicate-string': [0], - 'sonarjs/no-duplicated-branches': [0], - 'sonarjs/no-element-overwrite': [2], - 'sonarjs/no-empty-collection': [2], - 'sonarjs/no-extra-arguments': [2], - 'sonarjs/no-gratuitous-expressions': [2], - 'sonarjs/no-identical-conditions': [2], - 'sonarjs/no-identical-expressions': [2], - 'sonarjs/no-identical-functions': [2, 5], - 'sonarjs/no-ignored-return': [2], - 'sonarjs/no-inverted-boolean-check': [2], - 'sonarjs/no-nested-switch': [0], - 'sonarjs/no-nested-template-literals': [0], - 'sonarjs/no-one-iteration-loop': [2], - 'sonarjs/no-redundant-boolean': [2], - 'sonarjs/no-redundant-jump': [2], - 'sonarjs/no-same-line-conditional': [2], - 'sonarjs/no-small-switch': [0], - 'sonarjs/no-unused-collection': [2], - 'sonarjs/no-use-of-empty-return-value': [2], - 'sonarjs/no-useless-catch': [2], - 'sonarjs/non-existent-operator': [2], - 'sonarjs/prefer-immediate-return': [0], - 'sonarjs/prefer-object-literal': [0], - 'sonarjs/prefer-single-boolean-return': [0], - 'sonarjs/prefer-while': [2], - 'sort-imports': [0], - 'sort-keys': [0], - 'sort-vars': [0], - strict: [0], - 'symbol-description': [2], - 'unicode-bom': [2, 'never'], - 'unicorn/better-regex': [0], - 'unicorn/catch-error-name': [0], - 'unicorn/consistent-destructuring': [2], - 'unicorn/consistent-empty-array-spread': [2], - 'unicorn/consistent-existence-index-check': [2], - 'unicorn/consistent-function-scoping': [2], - 'unicorn/custom-error-definition': [0], - 'unicorn/empty-brace-spaces': [2], - 'unicorn/error-message': [0], - 'unicorn/escape-case': [0], - 'unicorn/expiring-todo-comments': [0], - 'unicorn/explicit-length-check': [0], - 'unicorn/filename-case': [0], - 'unicorn/import-index': [0], - 'unicorn/import-style': [0], - 'unicorn/new-for-builtins': [2], - 'unicorn/no-abusive-eslint-disable': [0], - 'unicorn/no-anonymous-default-export': [0], - 'unicorn/no-array-callback-reference': [0], - 'unicorn/no-array-for-each': [2], - 'unicorn/no-array-method-this-argument': [2], - 'unicorn/no-array-push-push': [2], - 'unicorn/no-array-reduce': [2], - 'unicorn/no-await-expression-member': [0], - 'unicorn/no-await-in-promise-methods': [2], - 'unicorn/no-console-spaces': [0], - 'unicorn/no-document-cookie': [2], - 'unicorn/no-empty-file': [2], - 'unicorn/no-for-loop': [0], - 'unicorn/no-hex-escape': [0], - 'unicorn/no-instanceof-array': [0], - 'unicorn/no-invalid-fetch-options': [2], - 'unicorn/no-invalid-remove-event-listener': [2], - 'unicorn/no-keyword-prefix': [0], - 'unicorn/no-length-as-slice-end': [2], - 'unicorn/no-lonely-if': [2], - 'unicorn/no-magic-array-flat-depth': [0], - 'unicorn/no-negated-condition': [0], - 'unicorn/no-negation-in-equality-check': [2], - 'unicorn/no-nested-ternary': [0], - 'unicorn/no-new-array': [0], - 'unicorn/no-new-buffer': [0], - 'unicorn/no-null': [0], - 'unicorn/no-object-as-default-parameter': [0], - 'unicorn/no-process-exit': [0], - 'unicorn/no-single-promise-in-promise-methods': [2], - 'unicorn/no-static-only-class': [2], - 'unicorn/no-thenable': [2], - 'unicorn/no-this-assignment': [2], - 'unicorn/no-typeof-undefined': [2], - 'unicorn/no-unnecessary-await': [2], - 'unicorn/no-unnecessary-polyfills': [2], - 'unicorn/no-unreadable-array-destructuring': [0], - 'unicorn/no-unreadable-iife': [2], - 'unicorn/no-unused-properties': [2], - 'unicorn/no-useless-fallback-in-spread': [2], - 'unicorn/no-useless-length-check': [2], - 'unicorn/no-useless-promise-resolve-reject': [2], - 'unicorn/no-useless-spread': [2], - 'unicorn/no-useless-switch-case': [2], - 'unicorn/no-useless-undefined': [0], - 'unicorn/no-zero-fractions': [2], - 'unicorn/number-literal-case': [0], - 'unicorn/numeric-separators-style': [0], - 'unicorn/prefer-add-event-listener': [2], - 'unicorn/prefer-array-find': [2], - 'unicorn/prefer-array-flat-map': [2], - 'unicorn/prefer-array-flat': [2], - 'unicorn/prefer-array-index-of': [2], - 'unicorn/prefer-array-some': [2], - 'unicorn/prefer-at': [0], - 'unicorn/prefer-blob-reading-methods': [2], - 'unicorn/prefer-code-point': [0], - 'unicorn/prefer-date-now': [2], - 'unicorn/prefer-default-parameters': [0], - 'unicorn/prefer-dom-node-append': [2], - 'unicorn/prefer-dom-node-dataset': [0], - 'unicorn/prefer-dom-node-remove': [2], - 'unicorn/prefer-dom-node-text-content': [2], - 'unicorn/prefer-event-target': [2], - 'unicorn/prefer-export-from': [0], - 'unicorn/prefer-global-this': [0], - 'unicorn/prefer-includes': [2], - 'unicorn/prefer-json-parse-buffer': [0], - 'unicorn/prefer-keyboard-event-key': [2], - 'unicorn/prefer-logical-operator-over-ternary': [2], - 'unicorn/prefer-math-min-max': [2], - 'unicorn/prefer-math-trunc': [2], - 'unicorn/prefer-modern-dom-apis': [0], - 'unicorn/prefer-modern-math-apis': [2], - 'unicorn/prefer-module': [2], - 'unicorn/prefer-native-coercion-functions': [2], - 'unicorn/prefer-negative-index': [2], - 'unicorn/prefer-node-protocol': [2], - 'unicorn/prefer-number-properties': [0], - 'unicorn/prefer-object-from-entries': [2], - 'unicorn/prefer-object-has-own': [0], - 'unicorn/prefer-optional-catch-binding': [2], - 'unicorn/prefer-prototype-methods': [0], - 'unicorn/prefer-query-selector': [0], - 'unicorn/prefer-reflect-apply': [0], - 'unicorn/prefer-regexp-test': [2], - 'unicorn/prefer-set-has': [0], - 'unicorn/prefer-set-size': [2], - 'unicorn/prefer-spread': [0], - 'unicorn/prefer-string-raw': [0], - 'unicorn/prefer-string-replace-all': [0], - 'unicorn/prefer-string-slice': [0], - 'unicorn/prefer-string-starts-ends-with': [2], - 'unicorn/prefer-string-trim-start-end': [2], - 'unicorn/prefer-structured-clone': [2], - 'unicorn/prefer-switch': [0], - 'unicorn/prefer-ternary': [0], - 'unicorn/prefer-text-content': [2], - 'unicorn/prefer-top-level-await': [0], - 'unicorn/prefer-type-error': [0], - 'unicorn/prevent-abbreviations': [0], - 'unicorn/relative-url-style': [2], - 'unicorn/require-array-join-separator': [2], - 'unicorn/require-number-to-fixed-digits-argument': [2], - 'unicorn/require-post-message-target-origin': [0], - 'unicorn/string-content': [0], - 'unicorn/switch-case-braces': [0], - 'unicorn/template-indent': [2], - 'unicorn/text-encoding-identifier-case': [0], - 'unicorn/throw-new-error': [2], - 'use-isnan': [2], - - 'valid-typeof': [2, { - requireStringLiterals: true, - }], - - 'vars-on-top': [0], - 'wc/attach-shadow-constructor': [2], - 'wc/define-tag-after-class-definition': [0], - 'wc/expose-class-on-global': [0], - 'wc/file-name-matches-element': [2], - 'wc/guard-define-call': [0], - 'wc/guard-super-call': [2], - 'wc/max-elements-per-file': [0], - 'wc/no-child-traversal-in-attributechangedcallback': [2], - 'wc/no-child-traversal-in-connectedcallback': [2], - 'wc/no-closed-shadow-root': [2], - 'wc/no-constructor-attributes': [2], - 'wc/no-constructor-params': [2], - 'wc/no-constructor': [2], - 'wc/no-customized-built-in-elements': [2], - 'wc/no-exports-with-element': [0], - 'wc/no-invalid-element-name': [2], - 'wc/no-invalid-extends': [2], - 'wc/no-method-prefixed-with-on': [2], - 'wc/no-self-class': [2], - 'wc/no-typos': [2], - 'wc/require-listener-teardown': [2], - 'wc/tag-name-matches-class': [2], - yoda: [2, 'never'], - }, -}, -{ - ignores: ['*.vue', '**/*.vue'], - rules: { - 'import-x/consistent-type-specifier-style': [0], - 'import-x/default': [0], - 'import-x/dynamic-import-chunkname': [0], - 'import-x/export': [2], - 'import-x/exports-last': [0], - - 'import-x/extensions': [2, 'always', { - ignorePackages: true, - }], - - 'import-x/first': [2], - 'import-x/group-exports': [0], - 'import-x/max-dependencies': [0], - 'import-x/named': [2], - 'import-x/namespace': [0], - 'import-x/newline-after-import': [0], - 'import-x/no-absolute-path': [0], - 'import-x/no-amd': [2], - 'import-x/no-anonymous-default-export': [0], - 'import-x/no-commonjs': [2], - - 'import-x/no-cycle': [2, { - ignoreExternal: true, - maxDepth: 1, - }], - - 'import-x/no-default-export': [0], - 'import-x/no-deprecated': [0], - 'import-x/no-dynamic-require': [0], - 'import-x/no-empty-named-blocks': [2], - 'import-x/no-extraneous-dependencies': [2], - 'import-x/no-import-module-exports': [0], - 'import-x/no-internal-modules': [0], - 'import-x/no-mutable-exports': [0], - 'import-x/no-named-as-default-member': [0], - 'import-x/no-named-as-default': [2], - 'import-x/no-named-default': [0], - 'import-x/no-named-export': [0], - 'import-x/no-namespace': [0], - 'import-x/no-nodejs-modules': [0], - 'import-x/no-relative-packages': [0], - 'import-x/no-relative-parent-imports': [0], - 'import-x/no-restricted-paths': [0], - 'import-x/no-self-import': [2], - 'import-x/no-unassigned-import': [0], - - 'import-x/no-unresolved': [2, { - commonjs: true, - ignore: ['\\?.+$', '^vitest/'], - }], - - 'import-x/no-useless-path-segments': [2, { - commonjs: true, - }], - - 'import-x/no-webpack-loader-syntax': [2], - 'import-x/order': [0], - 'import-x/prefer-default-export': [0], - 'import-x/unambiguous': [0], - }, -}, -{ - files: ['web_src/**/*'], - languageOptions: { - globals: { - __webpack_public_path__: true, - process: false, + 'playwright/prefer-comparison-matcher': [2], + 'playwright/prefer-equality-matcher': [2], + 'playwright/prefer-native-locators': [2], + 'playwright/prefer-to-contain': [2], + 'playwright/prefer-to-have-length': [2], + 'playwright/require-to-throw-message': [2], }, }, -}, { - files: ['web_src/**/*', 'docs/**/*'], - - languageOptions: { - globals: { - ...globals.browser, - }, - }, -}, { - files: ['web_src/**/*worker.*'], - - languageOptions: { - globals: { - ...globals.worker, - }, - }, - - rules: { - 'no-restricted-globals': [ - 2, - 'addEventListener', - 'blur', - 'close', - 'closed', - 'confirm', - 'defaultStatus', - 'defaultstatus', - 'error', - 'event', - 'external', - 'find', - 'focus', - 'frameElement', - 'frames', - 'history', - 'innerHeight', - 'innerWidth', - 'isFinite', - 'isNaN', - 'length', - 'locationbar', - 'menubar', - 'moveBy', - 'moveTo', - 'name', - 'onblur', - 'onerror', - 'onfocus', - 'onload', - 'onresize', - 'onunload', - 'open', - 'opener', - 'opera', - 'outerHeight', - 'outerWidth', - 'pageXOffset', - 'pageYOffset', - 'parent', - 'print', - 'removeEventListener', - 'resizeBy', - 'resizeTo', - 'screen', - 'screenLeft', - 'screenTop', - 'screenX', - 'screenY', - 'scroll', - 'scrollbars', - 'scrollBy', - 'scrollTo', - 'scrollX', - 'scrollY', - 'status', - 'statusbar', - 'stop', - 'toolbar', - 'top', - ], - }, -}, { - files: ['**/*.config.*'], - languageOptions: { - ecmaVersion: 'latest', - }, - rules: { - 'import-x/no-unused-modules': [0], - 'import-x/no-unresolved': [0], - }, -}, { - files: ['**/*.test.*', 'web_src/js/test/setup.js'], - languageOptions: { - globals: { - ...vitestGlobals.environments.env.globals, - }, - }, - - rules: { - '@vitest/consistent-test-filename': [0], - '@vitest/consistent-test-it': [0], - '@vitest/expect-expect': [0], - '@vitest/max-expects': [0], - '@vitest/max-nested-describe': [0], - '@vitest/no-alias-methods': [0], - '@vitest/no-commented-out-tests': [0], - '@vitest/no-conditional-expect': [0], - '@vitest/no-conditional-in-test': [0], - '@vitest/no-conditional-tests': [0], - '@vitest/no-disabled-tests': [0], - '@vitest/no-done-callback': [0], - '@vitest/no-duplicate-hooks': [0], - '@vitest/no-focused-tests': [0], - '@vitest/no-hooks': [0], - '@vitest/no-identical-title': [2], - '@vitest/no-interpolation-in-snapshots': [0], - '@vitest/no-large-snapshots': [0], - '@vitest/no-mocks-import': [0], - '@vitest/no-restricted-matchers': [0], - '@vitest/no-restricted-vi-methods': [0], - '@vitest/no-standalone-expect': [0], - '@vitest/no-test-prefixes': [0], - '@vitest/no-test-return-statement': [0], - '@vitest/prefer-called-with': [0], - '@vitest/prefer-comparison-matcher': [0], - '@vitest/prefer-each': [0], - '@vitest/prefer-equality-matcher': [0], - '@vitest/prefer-expect-resolves': [0], - '@vitest/prefer-hooks-in-order': [0], - '@vitest/prefer-hooks-on-top': [2], - '@vitest/prefer-lowercase-title': [0], - '@vitest/prefer-mock-promise-shorthand': [0], - '@vitest/prefer-snapshot-hint': [0], - '@vitest/prefer-spy-on': [0], - '@vitest/prefer-strict-equal': [0], - '@vitest/prefer-to-be': [0], - '@vitest/prefer-to-be-falsy': [0], - '@vitest/prefer-to-be-object': [0], - '@vitest/prefer-to-be-truthy': [0], - '@vitest/prefer-to-contain': [0], - '@vitest/prefer-to-have-length': [0], - '@vitest/prefer-todo': [0], - '@vitest/require-hook': [0], - '@vitest/require-to-throw-message': [0], - '@vitest/require-top-level-describe': [0], - '@vitest/valid-describe-callback': [2], - '@vitest/valid-expect': [2], - '@vitest/valid-title': [2], - }, -}, { - files: ['web_src/js/modules/fetch.js', 'web_src/js/standalone/**/*'], - - rules: { - 'no-restricted-syntax': [ - 2, - 'WithStatement', - 'ForInStatement', - 'LabeledStatement', - 'SequenceExpression', - ], - }, -}, { - files: ['tests/e2e/**/*.js'], - languageOptions: { - globals: { - ...globals.browser, - }, - - ecmaVersion: 'latest', - sourceType: 'module', - }, - rules: { - ...playwright.configs['flat/recommended'].rules, - 'playwright/no-conditional-in-test': [0], - 'playwright/no-conditional-expect': [0], - 'playwright/no-networkidle': [0], - - 'playwright/no-skipped-test': [ - 2, - { - allowConditional: true, + ...vue.configs['flat/recommended'], + { + files: ['web_src/js/components/*.vue'], + languageOptions: { + globals: { + ...globals.browser, }, - ], - 'playwright/no-useless-await': [2], - 'playwright/prefer-comparison-matcher': [2], - 'playwright/prefer-equality-matcher': [2], - 'playwright/prefer-native-locators': [2], - 'playwright/prefer-to-contain': [2], - 'playwright/prefer-to-have-length': [2], - 'playwright/require-to-throw-message': [2], - }, -}, -...vue.configs['flat/recommended'], -{ - files: ['web_src/js/components/*.vue'], - languageOptions: { - globals: { - ...globals.browser, + ecmaVersion: 'latest', + sourceType: 'module', + }, + rules: { + 'vue/attributes-order': [0], + 'vue/html-closing-bracket-spacing': [2, { + startTag: 'never', + endTag: 'never', + selfClosingTag: 'never', + }], + 'vue/max-attributes-per-line': [0], + 'vue-scoped-css/enforce-style-type': [0], }, - - ecmaVersion: 'latest', - sourceType: 'module', }, - rules: { - 'vue/attributes-order': [0], - 'vue/html-closing-bracket-spacing': [2, { - startTag: 'never', - endTag: 'never', - selfClosingTag: 'never', - }], - 'vue/max-attributes-per-line': [0], - 'vue-scoped-css/enforce-style-type': [0], - }, -}, -]; +); diff --git a/package-lock.json b/package-lock.json index d08c9b7c7c..0206dc2ef8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,11 +66,13 @@ "@stoplight/spectral-cli": "6.13.1", "@stylistic/eslint-plugin-js": "2.9.0", "@stylistic/stylelint-plugin": "3.1.1", + "@typescript-eslint/parser": "8.11.0", "@vitejs/plugin-vue": "5.1.4", "@vitest/coverage-v8": "2.1.4", "@vitest/eslint-plugin": "1.1.7", "@vue/test-utils": "2.4.6", "eslint": "9.13.0", + "eslint-import-resolver-typescript": "3.6.3", "eslint-plugin-array-func": "4.0.0", "eslint-plugin-import-x": "4.3.1", "eslint-plugin-no-jquery": "3.0.2", @@ -93,6 +95,8 @@ "stylelint-declaration-strict-value": "1.10.6", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", + "typescript": "5.6.3", + "typescript-eslint": "8.11.0", "vite-string-plugin": "1.3.4", "vitest": "2.1.4" }, @@ -2485,262 +2489,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/linux-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", @@ -2757,102 +2505,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.0.tgz", @@ -3502,6 +3154,16 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@npmcli/fs": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", @@ -3614,188 +3276,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.2.tgz", - "integrity": "sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.2.tgz", - "integrity": "sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.2.tgz", - "integrity": "sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.2.tgz", - "integrity": "sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.2.tgz", - "integrity": "sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.2.tgz", - "integrity": "sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.2.tgz", - "integrity": "sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.2.tgz", - "integrity": "sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.2.tgz", - "integrity": "sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.2.tgz", - "integrity": "sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.2.tgz", - "integrity": "sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.2.tgz", - "integrity": "sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.2.tgz", - "integrity": "sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.24.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.2.tgz", @@ -3824,48 +3304,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.2.tgz", - "integrity": "sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.2.tgz", - "integrity": "sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.2.tgz", - "integrity": "sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -4551,6 +3989,69 @@ "dev": true, "license": "MIT" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", + "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/type-utils": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", + "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.11.0", + "@typescript-eslint/types": "8.11.0", + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/visitor-keys": "8.11.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", @@ -4569,6 +4070,31 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", + "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.11.0", + "@typescript-eslint/utils": "8.11.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/types": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", @@ -7908,6 +7434,42 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", + "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, "node_modules/eslint-module-utils": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", @@ -9349,20 +8911,6 @@ "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -10193,6 +9741,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-bun-module": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", + "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -15298,6 +14856,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.11.0.tgz", + "integrity": "sha512-cBRGnW3FSlxaYwU8KfAewxFK5uzeOAp0l2KebIlPDOT5olVi65KDG/yjBooPBG0kGW/HLkoz1c/iuBFehcS3IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.11.0", + "@typescript-eslint/parser": "8.11.0", + "@typescript-eslint/utils": "8.11.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/typo-js": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/typo-js/-/typo-js-1.2.4.tgz", @@ -15597,21 +15179,6 @@ "dev": true, "license": "MIT" }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vite/node_modules/rollup": { "version": "4.24.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.2.tgz", diff --git a/package.json b/package.json index c420353260..f852fbe9cd 100644 --- a/package.json +++ b/package.json @@ -65,11 +65,13 @@ "@stoplight/spectral-cli": "6.13.1", "@stylistic/eslint-plugin-js": "2.9.0", "@stylistic/stylelint-plugin": "3.1.1", + "@typescript-eslint/parser": "8.11.0", "@vitejs/plugin-vue": "5.1.4", "@vitest/coverage-v8": "2.1.4", "@vitest/eslint-plugin": "1.1.7", "@vue/test-utils": "2.4.6", "eslint": "9.13.0", + "eslint-import-resolver-typescript": "3.6.3", "eslint-plugin-array-func": "4.0.0", "eslint-plugin-import-x": "4.3.1", "eslint-plugin-no-jquery": "3.0.2", @@ -92,8 +94,12 @@ "stylelint-declaration-strict-value": "1.10.6", "stylelint-value-no-unknown-custom-properties": "6.0.1", "svgo": "3.2.0", + "typescript": "5.6.3", + "typescript-eslint": "8.11.0", "vite-string-plugin": "1.3.4", "vitest": "2.1.4" }, - "browserslist": ["defaults"] + "browserslist": [ + "defaults" + ] } diff --git a/playwright.config.js b/playwright.config.ts similarity index 99% rename from playwright.config.js rename to playwright.config.ts index 25e2a7ab71..194f7f7d36 100644 --- a/playwright.config.js +++ b/playwright.config.ts @@ -1,4 +1,3 @@ -// @ts-check import {devices} from '@playwright/test'; const BASE_URL = process.env.GITEA_URL?.replace?.(/\/$/g, '') || 'http://localhost:3000'; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..88130812fe --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,30 @@ +{ + "include": [ + "*", + "tests/e2e/**/*", + "tools/**/*", + "web_src/js/**/*", + ], + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["dom", "dom.iterable", "dom.asynciterable", "esnext"], + "allowImportingTsExtensions": true, + "allowJs": true, + "allowSyntheticDefaultImports": true, + "alwaysStrict": true, + "esModuleInterop": true, + "isolatedModules": true, + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "verbatimModuleSyntax": true, + "stripInternal": true, + "strict": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noPropertyAccessFromIndexSignature": false, + "exactOptionalPropertyTypes": false, + } +} diff --git a/vitest.config.js b/vitest.config.ts similarity index 100% rename from vitest.config.js rename to vitest.config.ts diff --git a/web_src/js/features/repo-legacy.js b/web_src/js/features/repo-legacy.js index 73aaa457f2..05120cb0cb 100644 --- a/web_src/js/features/repo-legacy.js +++ b/web_src/js/features/repo-legacy.js @@ -119,7 +119,7 @@ export function initRepoCommentForm() { hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var - const clickedItem = this; // eslint-disable-line unicorn/no-this-assignment + const clickedItem = this; // eslint-disable-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias const scope = this.getAttribute('data-scope'); $(this).parent().find('.item').each(function () { @@ -416,7 +416,10 @@ async function onEditContent(event) { context: editContentZone.getAttribute('data-context'), content_version: editContentZone.getAttribute('data-content-version'), }); - for (const fileInput of dropzoneInst?.element.querySelectorAll('.files [name=files]')) params.append('files[]', fileInput.value); + const files = dropzoneInst?.element?.querySelectorAll('.files [name=files]') ?? []; + for (const fileInput of files) { + params.append('files[]', fileInput.value); + } const response = await POST(editContentZone.getAttribute('data-update-url'), {data: params}); const data = await response.json(); diff --git a/web_src/js/webcomponents/overflow-menu.js b/web_src/js/webcomponents/overflow-menu.js index a69ce1681c..54f8371927 100644 --- a/web_src/js/webcomponents/overflow-menu.js +++ b/web_src/js/webcomponents/overflow-menu.js @@ -4,7 +4,7 @@ import {isDocumentFragmentOrElementNode} from '../utils/dom.js'; import octiconKebabHorizontal from '../../../public/assets/img/svg/octicon-kebab-horizontal.svg'; window.customElements.define('overflow-menu', class extends HTMLElement { - updateItems = throttle(100, () => { + updateItems = throttle(100, () => { // eslint-disable-line unicorn/consistent-function-scoping if (!this.tippyContent) { const div = document.createElement('div'); div.classList.add('tippy-target'); diff --git a/webpack.config.js b/webpack.config.js index ebbc51a381..4662a30db5 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -178,13 +178,13 @@ export default { }, }, { - test: /\.js$/i, + test: /\.(js|ts)$/i, exclude: /node_modules/, use: [ { loader: 'esbuild-loader', options: { - loader: 'js', + loader: 'ts', target: 'es2020', }, }, From 031451e740020d9d994b67d6e5a6a35043fbfd70 Mon Sep 17 00:00:00 2001 From: Codeberg Translate Date: Wed, 30 Oct 2024 15:09:27 +0000 Subject: [PATCH 22/75] i18n: update of translations from Codeberg Translate (#5681) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 0ko <0ko@users.noreply.translate.codeberg.org> Co-authored-by: artnay Co-authored-by: emansije Co-authored-by: Gusted Co-authored-by: Outbreak2096 Co-authored-by: Benedikt Straub Co-authored-by: Fjuro Co-authored-by: Juno Takano Co-authored-by: Bálint Gonda Co-authored-by: Wuzzy Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/5681 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Codeberg Translate Co-committed-by: Codeberg Translate --- options/locale/locale_cs-CZ.ini | 11 +- options/locale/locale_de-DE.ini | 11 +- options/locale/locale_fi-FI.ini | 704 ++++++++++++++++++++++++++++---- options/locale/locale_fr-FR.ini | 2 +- options/locale/locale_hu-HU.ini | 3 +- options/locale/locale_nds.ini | 15 +- options/locale/locale_nl-NL.ini | 2 +- options/locale/locale_pt-BR.ini | 7 +- options/locale/locale_pt-PT.ini | 61 +-- options/locale/locale_ru-RU.ini | 13 +- options/locale/locale_zh-CN.ini | 8 +- 11 files changed, 710 insertions(+), 127 deletions(-) diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 49733e6ee1..829df0124f 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -479,6 +479,7 @@ sign_up_button = Zaregistrujte se nyní. back_to_sign_in = Zpět na přihlášení sign_in_openid = Pokračovat s OpenID unauthorized_credentials = Údaje jsou nesprávné nebo vypršely. Opakujte svůj příkaz nebo se podívejte na %s pro více informací +use_onetime_code = Použít jednorázový kód [mail] view_it_on=Zobrazit na %s @@ -1778,8 +1779,8 @@ issues.review.left_comment=zanechal komentář issues.review.content.empty=Je potřeba zanechat poznámku s uvedením požadované změny (požadovaných změn). issues.review.reject=požádal/a o změny %s issues.review.wait=byl/a požádán/a o posouzení %s -issues.review.add_review_request=požádal/a o posouzení od %s %s -issues.review.remove_review_request=odstranil/a žádost o posouzení na %s %s +issues.review.add_review_request=požádal/a o kontrolu od %[1]s %[2]s +issues.review.remove_review_request=odstranil/a žádost o kontrolu u %[1]s %[2]s issues.review.remove_review_request_self=odmítl/a posoudit %s issues.review.pending=Čekající issues.review.pending.tooltip=Tento komentář není momentálně viditelný pro ostatní uživatele. Chcete-li odeslat Vaše čekající komentáře, vyberte „%s“ → „%s/%s/%s“ v horní části stránky. @@ -2846,6 +2847,12 @@ mirror_use_ssh.not_available = Ověřování SSH není dostupné. issues.new.assign_to_me = Přiřadit mně issues.all_title = Vše settings.discord_icon_url.exceeds_max_length = Adresa URL ikony musí mít méně než 2048 znaků +issues.review.add_review_requests = požádal/a o kontroly od %[1]s %[2]s +issues.review.remove_review_requests = odstranil/a žádosti o kontrolu u %[1]s %[2]s +issues.review.add_remove_review_requests = požádal/a o kontroly od %[1]s a odstranil/a žádosti u %[2]s %[3]s +pulls.delete_after_merge.head_branch.is_default = Větev hlavy, kterou chcete odstranit, je výchozí větví a nelze ji odstranit. +pulls.delete_after_merge.head_branch.is_protected = Větev hlavy, kterou chcete odstranit, je chráněnou větví a nelze ji odstranit. +pulls.delete_after_merge.head_branch.insufficient_branch = Nemáte oprávnění k odstranění větve hlavy. [graphs] component_loading_info = Tohle může chvíli trvat… diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 77a90e0fe4..997dd8c2a0 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -477,6 +477,7 @@ sign_in_openid = Mit OpenID fortfahren hint_login = Hast du bereits ein Konto? Jetzt anmelden! hint_register = Brauchst du ein Konto? Jetzt registrieren. unauthorized_credentials = Die Zugangsdaten sind inkorrekt oder abgelaufen. Versuchen es erneut oder siehe %s für mehr Informationen +use_onetime_code = Einen One-Time-Code benutzen [mail] view_it_on=Auf %s ansehen @@ -1772,8 +1773,8 @@ issues.review.left_comment=hat einen Kommentar hinterlassen issues.review.content.empty=Du musst einen Kommentar hinterlassen, der die gewünschte(n) Änderung(en) beschreibt. issues.review.reject=hat %s Änderungen angefragt issues.review.wait=wurde für ein Review %s angefragt -issues.review.add_review_request=hat ein Review von %s %s angefragt -issues.review.remove_review_request=hat die Aufforderung zum Review an %s %s entfernt +issues.review.add_review_request=hat ein Review von %[1]s %[2]s angefragt +issues.review.remove_review_request=hat die Aufforderung zum Review an %[1]s %[2]s entfernt issues.review.remove_review_request_self=hat das Review verweigert %s issues.review.pending=Ausstehend issues.review.pending.tooltip=Dieser Kommentar ist derzeit nicht für andere Benutzer sichtbar. Um deine ausstehenden Kommentare einzureichen, wähle „%s“ -> „%s/%s/%s“ oben auf der Seite. @@ -2831,6 +2832,12 @@ mirror_use_ssh.not_available = SSH-Authentifizierung ist nicht verfügbar. issues.new.assign_to_me = Mir selbst zuweisen issues.all_title = Alle settings.discord_icon_url.exceeds_max_length = Die Icon-URL darf eine Länge von 2048 Zeichen nicht überschreiten +issues.review.add_review_requests = hat Reviews von %[1]s %[2]s angefragt +issues.review.remove_review_requests = hat Aufforderungen zum Review an %[1]s %[2]s entfernt +issues.review.add_remove_review_requests = hat Reviews von %[1]s angefragt und hat die Aufforderungen zum Review an %[2]s %[3]s entfernt +pulls.delete_after_merge.head_branch.is_default = Der Head-Branch, den Sie löschen wollen, ist der Standardbranch und kann nicht gelöscht werden. +pulls.delete_after_merge.head_branch.is_protected = Der Head-Branch, den Sie löschen wollen, ist ein geschützter Branch und kann nicht gelöscht werden. +pulls.delete_after_merge.head_branch.insufficient_branch = Sie haben keine Erlaubnis, den Head-Branch zu löschen. [graphs] diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 40a3f64880..2ccbbf0978 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -26,7 +26,7 @@ return_to_forgejo=Palaa Forgejohon username=Käyttäjätunnus email=Sähköpostiosoite password=Salasana -access_token=Pääsymerkki +access_token=Pääsypoletti re_type=Vahvista salasana captcha=CAPTCHA twofa=Kaksivaiheinen todennus @@ -71,7 +71,7 @@ collaborative=Yhteistyössä forks=Haarat activities=Toimet -pull_requests=Pull requestit +pull_requests=Vetopyynnöt issues=Ongelmat milestones=Merkkipaalut @@ -151,10 +151,10 @@ new_repo.title = Uusi repositorio new_org.title = Uusi organisaatio new_org.link = Uusi organisaatio new_repo.link = Uusi repositorio -new_migrate.link = Uusi siirto +new_migrate.link = Uusi migraatio rerun_all = Uudelleensuorita kaikki työt artifacts = Artifaktit -confirm_delete_artifact = Oletko varma, että haluat poistaa artifaktin "%s" ? +confirm_delete_artifact = Haluatko varmasti poistaa artifaktin "%s"? new_migrate.title = Uusi migraatio test = Testi concept_system_global = Globaali @@ -170,6 +170,7 @@ filter.not_mirror = Ei peilattu footer.links = Linkit navbar = Navigaatiopalkki footer.software = Tietoja tästä ohjelmistosta +footer = Alatunniste [heatmap] less = Vähemmän @@ -178,6 +179,7 @@ number_of_contributions_in_the_last_12_months = %s kontribuutiota viimeisimmän contributions_zero = Ei kontribuutioita contributions_one = kontribuutio contributions_few = kontribuutiota +contributions_format = {contributions} {day}. {month} {year} [editor] buttons.code.tooltip = Lisää koodia @@ -193,6 +195,8 @@ buttons.list.ordered.tooltip = Lisää numeroitu lista buttons.switch_to_legacy.tooltip = Käytä vanhentunutta tekstieditoria buttons.indent.tooltip = Sisennä yhden tason verran buttons.quote.tooltip = Lainaa tekstiä +buttons.enable_monospace_font = Käytä tasalevyistä fonttia +buttons.ref.tooltip = Viittaa ongelmaa tai vetopyyntöä [filter] string.asc = A - Ö @@ -205,24 +209,26 @@ invalid_csrf=Virheellinen pyyntö: Virheellinen CSRF-tunniste not_found=Kohdetta ei löytynyt. network_error=Verkkovirhe server_internal = Palvelinvirhe +report_message = Jos uskot tämän olevan Forgejon virhe, etsi ongelmia Codebergissä tai avaa tarvittaessa uusi ongelma. [startpage] app_desc=Kivuton, itsehostattu Git-palvelu install=Helppo asentaa platform=Alustariippumaton -platform_desc=Forgejo käy missä tahansa alustassa, johon Go kykenee kääntämään. Windows, macOS, Linux, ARM, jne. Valitse omasi! +platform_desc=Forgejo on mahdollista suorittaa vapaissa käyttöjärjestelmissä kuten Linux ja FreeBSD, ja se toimii eri suoritinarkkitehtuureilla. Valitse omasi! lightweight=Kevyt lightweight_desc=Forgejolla on vähäiset vähimmäisvaatimukset, joten se toimii jopa halvassa Raspberry Pi:ssä. Säästä koneesi energiaa! license=Avoin lähdekoodi license_desc=Mene osoitteeseen Forgejo! Liity mukaan tekemään projektista entistäkin parempi. Älä ujostele avustamista! +install_desc = Suorita alustallesi suunnattu binääritiedosto, jaa se kontitettuna tai hanki se pakattuna. [install] install=Asennus title=Alkuperäiset asetukset docker_helper=Jos ajat Forgejoa Dockerin sisällä, lue ohjeet ennen minkään asetuksen muuttamista. -require_db_desc=Forgejo tarvitsee toimiakseen MySQL, PostgreSQL, SQLite3 tai TiDB (MySQL protokolla) tietokannan. -db_title=Tietokanta-asetukset -db_type=Tietokantatyyppi +require_db_desc=Forgejo tarvitsee toimiakseen MySQL-, PostgreSQL-, SQLite3- tai TiDB- (MySQL-protokolla) tietokannan. +db_title=Tietokannan asetukset +db_type=Tietokannan tyyppi host=Isäntä user=Käyttäjätunnus password=Salasana @@ -244,8 +250,8 @@ err_admin_name_is_reserved=Ylläpitäjän käyttäjätunnus on virheellinen: kä err_admin_name_is_invalid=Ylläpitäjän käyttäjätunnus on virheellinen general_title=Yleiset asetukset -app_name=Sivuston otsikko -app_name_helper=Voit syöttää yrityksesi nimen tähän. +app_name=Instanssin otsikko +app_name_helper=Syötä instanssin nimi tähän. Se näytetään kaikilla sivuilla. repo_path=Repositorion juuren polku repo_path_helper=Muualla olevat git-repositoriot tullaan tallentamaan tähän kansioon. lfs_path=Git LFS -juuripolku @@ -255,7 +261,7 @@ domain=Palvelimen verkkotunnus ssh_port=SSH-palvelimen portti ssh_port_helper=Porttinumero, jossa SSH-palvelimesi kuuntelee. Jätä tyhjäksi kytkeäksesi SSH-palvelimen pois päältä. http_port=HTTP-kuunteluportti -http_port_helper=Portti, jossa Forgejon web-palvelin kuuntelee. +http_port_helper=Portti, jota Forgejon web-palvelin käyttää. app_url=Juuriosoite app_url_helper=Juuriosoite HTTP(S)-klooniosoitteille ja sähköpostimuistutuksille. log_root_path=Lokitiedostojen polku @@ -263,7 +269,7 @@ log_root_path_helper=Lokitiedostot kirjoitetaan tähän kansioon. optional_title=Valinnaiset asetukset email_title=Sähköpostiasetukset -smtp_addr=SMTP isäntä +smtp_addr=SMTP-isäntä smtp_port=SMTP-portti smtp_from=Lähetä sähköpostit osoitteella smtp_from_helper=Sähköpostiosoite, jota Forgejo käyttää. Kirjoita osoite ”nimi” -muodossa. @@ -328,6 +334,8 @@ allow_only_external_registration = Salli rekisteröinti vain ulkoisia palveluja default_allow_create_organization = Salli organisaatioiden luonti oletuksena allow_dots_in_usernames = Salli pisteiden käyttö käyttäjänimissä. Ei vaikuta olemassaoleviin käyttäjiin. enable_update_checker = Ota päivitystentarkistus käyttöön +app_slogan = Instanssin tunnuslause +app_slogan_helper = Syötä instanssin tunnuslause tähän. Jätä tyhjäksi poistaaksesi käytöstä. [home] uname_holder=Käyttäjätunnus tai sähköpostiosoite @@ -465,6 +473,11 @@ release.download.zip=Lähdekoodi (ZIP) release.download.targz=Lähdekoodi (TAR.GZ) repo.transfer.to_you=sinä +password_change.subject = Salasanasi on vaihdettu +password_change.text_1 = Tilisi salasana vaihdettiin juuri hetki sitten. +removed_security_key.subject = Turva-avain on poistettu +removed_security_key.text_1 = Turva-avain "%[1]s" on poistettu tililtäsi. +team_invite.text_2 = Napsauta seuraavaa linkkiä liittyäksesi tiimiin: @@ -530,13 +543,14 @@ auth_failed=Todennus epäonnistui: %v target_branch_not_exist=Kohde branchia ei ole olemassa. +Pronouns = Pronomini [user] change_avatar=Vaihda profiilikuvasi… repositories=Repot activity=Julkinen toiminta -followers_few=%d seuraajat +followers_few=%d seuraajaa starred=Tähdelliset repot projects=Projektit overview=Yleiskatsaus @@ -544,6 +558,15 @@ following_few=%d seurataan follow=Seuraa unfollow=Lopeta seuraaminen user_bio=Elämäkerta +settings = Käyttäjäasetukset +email_visibility.limited = Sähköpostiosoitteesi näkyy kaikille tunnistautuneille käyttäjille +followers_one = %d seuraaja +public_activity.visibility_hint.self_public = Toimintasi on näkyvissä kaikille, lukuun ottamatta vuorovaikutusta yksityisissä tiloissa. Määritä asetukset. +followers.title.one = seuraaja +followers.title.few = seuraajaa +following.title.one = Seurataan +following.title.few = Seurataan +joined_on = Liittynyt %s [settings] @@ -553,7 +576,7 @@ appearance=Ulkoasu password=Salasana security=Turvallisuus avatar=Profiilikuva -ssh_gpg_keys=SSH / GPG-avaimet +ssh_gpg_keys=SSH-/GPG-avaimet social=Sosiaaliset tilit applications=Sovellukset orgs=Hallitse organisaatioita @@ -566,7 +589,7 @@ webauthn=Turva-avaimet public_profile=Julkinen profiili password_username_disabled=Ei-paikalliset käyttäjät eivät voi muuttaa käyttäjätunnustaan. Ole hyvä ja ota yhteyttä sivuston ylläpitäjään saadaksesi lisätietoa. -full_name=Kokonimi +full_name=Koko nimi website=Nettisivut location=Sijainti update_theme=Päivitä teema @@ -641,8 +664,8 @@ add_openid_success=Uusi OpenID-osoite on lisätty. keep_email_private=Piilota sähköpostiosoite openid_desc=OpenID mahdollistaa todentamisen delegoinnin ulkopuoliselle palvelun tarjoajalle. -manage_ssh_keys=Hallitse SSH avaimia -manage_gpg_keys=Hallitse GPG avaimia +manage_ssh_keys=Hallitse SSH-avaimia +manage_gpg_keys=Hallitse GPG-avaimia add_key=Lisää avain ssh_desc=Nämä julkiset SSH-avaimet on liitetty tiliisi. Vastaavat yksityiset avaimet antavat täyden pääsyn repoihisi. gpg_desc=Nämä julkiset GPG-avaimet on liitetty tiliisi. Pidä yksityiset avaimet turvassa, koska ne mahdollistavat committien todentamisen. @@ -704,9 +727,9 @@ access_token_deletion_confirm_action=Poista permission_read=Luettu edit_oauth2_application=Muokkaa OAuth2 sovellusta -remove_oauth2_application=Poista OAuth2 sovellus +remove_oauth2_application=Poista OAuth2-sovellus remove_oauth2_application_success=Sovellus on poistettu. -create_oauth2_application=Luo uusi OAuth2 sovellus +create_oauth2_application=Luo uusi OAuth2-sovellus create_oauth2_application_button=Luo sovellus oauth2_application_name=Sovelluksen nimi save_application=Tallenna @@ -747,6 +770,37 @@ visibility=Käyttäjän näkyvyys visibility.public=Julkinen visibility.limited=Rajattu visibility.private=Yksityinen +hints = Vihjeet +user_block_success = Käyttäjä on estetty. +biography_placeholder = Kerro jotain itsestäsi! (Voit käyttää Markdownia) +keep_activity_private = Piilota toiminta profiilisivulla +update_oauth2_application_success = Päivitit OAuth2-sovelluksen. +webauthn_delete_key = Poista turva-avain +delete_account_desc = Haluatko varmasti poistaa tämän käyttäjätilin pysyvästi? +visibility.public_tooltip = Näkyvissä kaikille +pronouns = Pronomini +pronouns_custom = Mukautettu +language.title = Oletuskieli +webauthn_delete_key_desc = Jos poistat turva-avaimen, et voi enää kirjautua sillä. Jatketaanko? +authorized_oauth2_applications = Valtuutetut OAuth2-sovellukset +pronouns_unspecified = Määrittämätön +update_hints = Päivitä vihjeet +language.description = Tämä kieli tallennetaan tilillesi ja sitä käytetään oletuksena sisäänkirjautumisen jälkeen. +language.localization_project = Auta suomentamaan Forgejo! Lue lisää. +blocked_users_none = Käyttäjiä ei ole estetty. +location_placeholder = Jaa likimääräinen sijaintisi muiden kanssa +retype_new_password = Vahvista uusi salasana +create_oauth2_application_success = Loit uuden OAuth2-sovelluksen. +repos_none = Et omista yhtäkään repositoriota. +visibility.limited_tooltip = Näkyvissä vain tunnistautuneille käyttäjille +email_notifications.disable = Poista sähköposti-ilmoitukset käytöstä +webauthn_register_key = Lisää turva-avain +blocked_users = Estetyt käyttäjät +profile_desc = Määritä, miten muut näkevät profiilisi. Ensisijaista sähköpostiosoitettasi käytetään ilmoitusten ja salasanan palautuspyyntöjen lähettämiseen sekä verkkosivupohjaisiin Git-operaatioihin. +change_password_success = Salasanasi on päivitetty. Kirjaudu jatkossa käyttäen uutta salasanaa. +manage_oauth2_applications = Hallitse OAuth2-sovelluksia +change_password = Vaihda salasana +webauthn_key_loss_warning = Jos kadotat turva-avaimesi, menetät pääsyn tilillesi. [repo] owner=Omistaja @@ -776,7 +830,7 @@ license_helper=Valitse lisenssitiedosto. readme=README auto_init=Alusta repo (Luo .gitignore, License ja README) create_repo=Luo repo -default_branch=Oletus branch +default_branch=Oletushaara mirror_prune=Karsi watchers=Tarkkailijat stargazers=Tähtiharrastajat @@ -806,7 +860,7 @@ migrate_items_labels=Tunnisteet migrate_items_issues=Ongelmat migrate_items_pullrequests=Vetopyynnöt migrate_items_releases=Julkaisut -migrate_repo=Siirrä repo +migrate_repo=Tee repomigraatio migrate.clone_address=Migraation / Kloonaa URL osoitteesta migrate.github_token_desc=Voit laittaa yhden tai useamman pääsymerkin pilkulla erotellen tähän nopeuttaaksesi migraatiota GitHub APIn vauhtirajojen takia. VAROITUS: Tämän ominaisuuden väärinkäyttö voi rikkoa palveluntarjoajan ehtoja ja johtaa tilin estämiseen. migrate.permission_denied=Sinun ei sallita tuovan paikallisia repoja. @@ -852,8 +906,8 @@ file_history=Historia file_view_raw=Näytä raaka file_permalink=Pysyvä linkki -video_not_supported_in_browser=Selaimesi ei tue HTML5 video-tagia. -audio_not_supported_in_browser=Selaimesi ei tue HTML5 audio-tagia. +video_not_supported_in_browser=Selaimesi ei tue HTML5:n video-tagia. +audio_not_supported_in_browser=Selaimesi ei tue HTML5:n audio-tagia. blame=Selitys download_file=Lataa tiedosto normal_view=Normaali näkymä @@ -872,8 +926,8 @@ editor.filename_help=Lisää hakemisto kirjoittamalla sen nimi ja sen jälkeen k editor.or=tai editor.cancel_lower=Peru editor.commit_signed_changes=Commitoi vahvistetut muutokset -editor.commit_changes=Commitoi muutokset -editor.add_tmpl=Lisää '' +editor.commit_changes=Kommitoi muutokset +editor.add_tmpl=Lisää "" editor.commit_directly_to_this_branch=Commitoi suoraan %s haaraan. editor.create_new_branch=Luo uusi haara tälle commitille ja aloita vetopyyntö. editor.create_new_branch_np=Luo uusi haara tälle commitille. @@ -909,9 +963,9 @@ projects.new=Uusi projekti projects.deletion=Poista projekti projects.deletion_success=Projekti on poistettu. projects.edit=Muokkaa projektia -projects.modify=Päivitä projekti -projects.type.basic_kanban=Yksinkertainen Kanban -projects.template.desc=Malli +projects.modify=Muokkaa projektia +projects.type.basic_kanban=Yksinkertainen kanban +projects.template.desc=Mallipohja projects.type.uncategorized=Luokittelematon projects.column.edit_title=Nimi projects.column.new_title=Nimi @@ -923,7 +977,7 @@ issues.filter_assignees=Suodata käyttäjiä issues.filter_milestones=Suodata merkkipaalu issues.new=Uusi ongelma issues.new.labels=Tunnisteet -issues.new.no_label=Ei tunnistetta +issues.new.no_label=Ei tunnisteita issues.new.clear_labels=Tyhjennä tunnisteet issues.new.projects=Projektit issues.new.no_items=Ei kohteita @@ -938,7 +992,7 @@ issues.new.no_assignees=Ei käsittelijää issues.choose.open_external_link=Avaa issues.choose.blank=Oletus issues.no_ref=Haaraa/tagia ei määritelty -issues.create=Ilmoita ongelma +issues.create=Luo ongelma issues.new_label=Uusi tunniste issues.new_label_placeholder=Tunnisteen nimi issues.new_label_desc_placeholder=Kuvaus @@ -996,7 +1050,7 @@ issues.commented_at=`kommentoi %s` issues.delete_comment_confirm=Haluatko varmasti poistaa tämän kommentin? issues.context.copy_link=Kopioi linkki issues.context.quote_reply=Vastaa lainaamalla -issues.context.reference_issue=Viittaa uudesa ongelmassa +issues.context.reference_issue=Viittaa uudessa ongelmassa issues.context.edit=Muokkaa issues.context.delete=Poista issues.close_comment_issue=Kommentoi ja sulje @@ -1093,7 +1147,7 @@ pulls.no_results=Tuloksia ei löytynyt. pulls.nothing_to_compare=Nämä haarat vastaavat toisiaan. Ei ole tarvetta luoda vetopyyntöä. pulls.nothing_to_compare_and_allow_empty_pr=Nämä haarat vastaavat toisiaan. Vetopyyntö tulee olemaan tyhjä. pulls.has_pull_request=`Vetopyyntö haarojen välillä on jo olemassa: %[2]s#%[3]d` -pulls.create=Luo Pull-pyyntö +pulls.create=Luo vetopyyntö pulls.title_desc_few=haluaa yhdistää %[1]d committia lähteestä %[2]s kohteeseen %[3]s pulls.merged_title_desc_few=yhdistetty %[1]d committia lähteestä %[2]s kohteeseen %[3]s %[4]s pulls.tab_conversation=Keskustelu @@ -1158,17 +1212,17 @@ activity.period.quarterly=3 kuukautta activity.period.semiyearly=6 kuukautta activity.period.yearly=1 vuosi activity.overview=Yleiskatsaus -activity.active_prs_count_1=%d Aktiivinen vetopyyntö -activity.active_prs_count_n=%d Aktiivista vetopyyntöä +activity.active_prs_count_1=%d aktiivinen vetopyyntö +activity.active_prs_count_n=%d aktiivista vetopyyntöä activity.merged_prs_label=Yhdistetty -activity.active_issues_count_1=%d Aktiivinen ongelma -activity.active_issues_count_n=%d Aktiivista ongelmaa -activity.closed_issues_count_1=Suljettu ongelma -activity.closed_issues_count_n=Suljettua ongelmaa +activity.active_issues_count_1=%d aktiivinen ongelma +activity.active_issues_count_n=%d aktiivista ongelmaa +activity.closed_issues_count_1=suljettu ongelma +activity.closed_issues_count_n=suljettua ongelmaa activity.title.issues_created_by=%s luonnut %s activity.closed_issue_label=Suljettu activity.new_issues_count_1=Uusi ongelma -activity.new_issues_count_n=Uutta ongelmaa +activity.new_issues_count_n=uutta ongelmaa activity.new_issue_label=Avoinna activity.unresolved_conv_label=Auki activity.published_release_label=Julkaistu @@ -1181,7 +1235,7 @@ activity.git_stats_and_deletions=ja activity.git_stats_deletion_1=%d poisto activity.git_stats_deletion_n=%d poistoa -contributors.contribution_type.commits=Commitit +contributors.contribution_type.commits=Kommitit search=Haku search.match=Osuma @@ -1195,16 +1249,16 @@ settings.collaboration.read=Lue settings.collaboration.owner=Omistaja settings.collaboration.undefined=Määrittelemätön settings.hooks=Webkoukut -settings.githooks=Git koukut +settings.githooks=Git-koukut settings.basic_settings=Perusasetukset settings.mirror_settings=Peilauksen asetukset settings.site=Nettisivu -settings.update_settings=Päivitä asetukset +settings.update_settings=Tallenna asetukset settings.advanced_settings=Lisäasetukset settings.use_internal_wiki=Käytä sisäänrakennettua wikiä settings.use_external_wiki=Käytä ulkoista wikiä -settings.external_wiki_url=Ulkoinen Wiki URL +settings.external_wiki_url=Ulkoisen wikin URL-osoite settings.external_wiki_url_desc=Wiki-välilehden klikkaus ohjaa vierailijat ulkoisen wiki-URL-osoitteeseen. settings.tracker_url_format=Ulkoisen vikaseurannan URL muoto settings.tracker_issue_style.numeric=Numeerinen @@ -1266,7 +1320,7 @@ settings.event_issues_desc=Ongelma avattu, suljettu, avattu uudelleen tai muokat settings.event_issue_assign=Ongelma määritetty settings.event_issue_assign_desc=Ongelma osoitettu tai osoitus poistettu. settings.event_issue_label_desc=Ongelman tunnisteet päivitetty tai tyhjennetty. -settings.event_issue_milestone_desc=Ongelma merkkipaaluteettu tai merkkipaalu-osoitus poistettu. +settings.event_issue_milestone_desc=Merkkipaalu lisätty, poistettu tai muokattu. settings.event_issue_comment_desc=Ongelman kommentti luotu, muokattu tai poistettu. settings.event_header_pull_request=Vetopyyntöjen tapahtumat settings.event_pull_request=Vetopyyntö @@ -1276,7 +1330,7 @@ settings.add_hook_success=Uusi webkoukku on lisätty. settings.update_webhook=Päivitä webkoukku settings.delete_webhook=Poista webkoukku settings.recent_deliveries=Viimeisimmät toimitukset -settings.hook_type=Koukkutyyppi +settings.hook_type=Koukun tyyppi settings.slack_token=Pääsymerkki settings.slack_domain=Verkkotunnus settings.slack_channel=Kanava @@ -1306,14 +1360,14 @@ settings.deploy_key_deletion_desc=Julkaisuavaimen poistaminen kumoaa sen pääsy settings.deploy_key_deletion_success=Julkaisuavain on poistettu. settings.branches=Haarat settings.protected_branch=Haaran suojaus -settings.branch_protection=Haaran '%s' suojaus +settings.branch_protection=Haaran "%s" suojaussäännöt settings.protect_this_branch=Ota haaran suojaus käyttöön settings.protect_whitelist_deploy_keys=Lisää julkaisuavaimet sallittujen listalle mahdollistaaksesi repohin kirjoituksen. settings.protect_whitelist_users=Lista käyttäjistä joilla työntö oikeus: settings.protect_whitelist_search_users=Etsi käyttäjiä… settings.protect_merge_whitelist_committers_desc=Salli vain listaan merkittyjen käyttäjien ja tiimien yhdistää vetopyynnöt tähän haaraan. settings.protect_merge_whitelist_users=Lista käyttäjistä joilla yhdistämis-oikeus: -settings.protect_required_approvals=Vaadittavat hyväksynnät: +settings.protect_required_approvals=Vaadittavat hyväksynnät settings.protect_approvals_whitelist_users=Sallittujen tarkastajien lista: settings.choose_branch=Valitse haara… settings.no_protected_branch=Suojattuja haaroja ei ole. @@ -1390,16 +1444,16 @@ release.releases=Julkaisut release.tags=Tagit release.new_release=Uusi julkaisu release.draft=Työversio -release.prerelease=Esiversio +release.prerelease=Esijulkaisu release.stable=Vakaa -release.edit=muokkaa +release.edit=Muokkaa release.source_code=Lähdekoodi release.new_subheader=Julkaisut organisoivat projektien versioita. release.edit_subheader=Julkaisut organisoivat projektien versioita. release.tag_name=Taginimi release.target=Kohde release.tag_helper=Valitse olemassa oleva tagi tai luo uusi tagi. -release.prerelease_desc=Merkitse ensijulkaisuksi +release.prerelease_desc=Merkitse esijulkaisuksi release.prerelease_helper=Merkitse tämä julkaisu epäsopivaksi tuotantokäyttöön. release.cancel=Peruuta release.publish=Julkaise versio @@ -1443,14 +1497,301 @@ settings.branches.add_new_rule = Lisää uusi sääntö n_commit_few = %s kommittia issues.force_push_compare = Vertaa commits.desc = Selaa lähdekoodin muutoshistoriaa. +clone_helper = Tarvitseko apua kloonauksen kanssa? Siirry tukisivulle. +settings.mirror_settings.push_mirror.copy_public_key = Kopioi julkinen avain +object_format = Objektimuoto +editor.fail_to_update_file_summary = Virheviesti: +n_branch_one = %s haara +issues.content_history.delete_from_history_confirm = Poistetaanko historiasta? +editor.new_patch = Uusi paikkaus +pulls.merged_success = Vetopyyntö yhdistetty onnistuneesti ja suljettu +pulls.manually_merged = Manuaalisesti yhdistetty +pulls.merged_info_text = Haaran %s voi nyt poistaa. +pulls.status_checks_requested = Vaadittu +signing.wont_sign.not_signed_in = Et ole kirjautunut sisään. +tag.create_tag = Luo tagi %s +release.tag_already_exist = Tämä tagin nimi on jo olemassa. +activity.git_stats_additions = ja +release = Julkaisu +issues.num_comments_1 = %d kommentti +activity.title.issues_n = %d ongelmaa +release.detail = Julkaisun tiedot +diff.hide_file_tree = Piilota tiedostopuu +issues.role.owner_helper = Tämä käyttäjä on tämän repositorion omistaja. +issues.all_title = Kaikki +issues.label_archived_filter = Näytä arkistoidut tunnisteet +pulls.close = Sulje vetopyyntö +branch.already_exists = Haara nimellä "%s" on jo olemassa. +diff.show_file_tree = Näytä tiedostopuu +branch.deletion_failed = Haaran "%s" poistaminen epäonnistui. +branch.deletion_success = Haara "%s" on poistettu. +branch.delete_html = Poista haara +branch.restore_success = Haara "%s" on palautettu. +branch.restore_failed = Haaran "%s" palauttaminen epäonnistui. +mirror_public_key = Julkinen SSH-avain +mirror_use_ssh.text = Käytä SSH-todennusta +diff.show_more = Näytä enemmän +release.deletion_success = Tämä julkaisu on poistettu. +issues.filter_milestone_closed = Suljetut merkkipaalut +file_copy_permalink = Kopioi pysyväislinkki +empty_message = Tässä repossa ei ole sisältöä. +activity.git_stats_files_changed_n = on muutettu +settings.event_pull_request_milestone_desc = Merkkipaalu lisätty, poistettu tai muokattu. +settings.event_pull_request_comment = Kommentit +settings.event_issue_comment = Kommentit +diff.download_patch = Lataa patch-tiedosto +issues.filter_milestone_none = Ei merkkipaaluja +issues.filter_milestone_open = Avoimet merkkipaalut +new_repo_helper = Repositorio eli tietovarasto sisältää kaikki projektin tiedostot, mukaan lukien versiohistorian. Onko sinulla repo jo jossain muualla? Tee repomigraatio. +use_template = Käytä tätä mallipohjaa +star_guest_user = Kirjaudu sisään lisätäksesi tähden tähän repoon. +watch_guest_user = Kirjaudu sisään tarkkaillaksesi tätä repoa. +activity.git_stats_author_n = %d tekijää +issues.dependency.add_error_dep_exists = Riippuvuus on jo olemassa. +wiki.page_content = Sivun sisältö +wiki.page_title = Sivun otsikko +activity.navbar.contributors = Kontribuuttorit +n_release_few = %s julkaisua +n_release_one = %s julkaisu +symbolic_link = Symbolinen linkki +mirror_last_synced = Viimeksi synkronoitu +find_file.go_to_file = Löydä tiedosto +find_tag = Etsi tagi +settings.protected_branch.save_rule = Tallenna sääntö +pulls.merge_manually = Manuaalisesti yhdistetty +diff.stats_desc_file = %d muutosta: %d lisäystä ja %d poistoa +branch.included_desc = Tämä haara on osa oletushaaraa +branch.confirm_create_branch = Luo haara +projects.column.edit = Muokkaa saraketta +editor.add_file = Lisää tiedosto +milestones.deletion_success = Merkkipaalu on poistettu. +project = Projektit +pulls.delete.title = Poistetaanko tämä vetopyyntö? +activity.title.issues_1 = %d ongelma +contributors.contribution_type.filter_label = Kontribuution tyyppi: +settings.protected_branch.delete_rule = Poista sääntö +settings.archive.success = Repo arkistoitiin onnistuneesti. +diff.comment.placeholder = Jätä kommentti +release.message = Kuvaile tätä julkaisua +branch.delete_desc = Haaran poistaminen on pysyvä toimenpide. Vaikka poistettu haara voi jäädä olemaan lyhyeksi ajaksi, ennen kuin todellisesti poistetaan, poistoa EI VOI perua useimmiten. Jatketaanko? +branch.protected_deletion_failed = Haara "%s" on suojattu. Sitä ei voi poistaa. +open_with_editor = Avaa sovelluksella %s +download_bundle = Lataa BUNDLE +pulls.num_conflicting_files_1 = %d ristiriitainen tiedosto +editor.update = Päivitä %s +editor.add = Lisää %s +activity.published_prerelease_label = Esijulkaisu +activity.published_tag_label = Tagi +diff.download_diff = Lataa diff-tiedosto +settings.event_package = Paketti +issues.new.closed_projects = Suljetut projektit +settings.event_issue_milestone = Merkkipaalut +branch.branch_already_exists = Haara "%s" on jo olemassa repossa. +projects.card_type.images_and_text = Kuvat ja teksti +default_branch_helper = Oletusarvoinen haara on oletushaara vetopyynnöille ja koodikommiteille. +author_search_tooltip = Näyttää enintään 30 käyttäjää +migrate_options_mirror_helper = Tästä reposta tulee peili +commit_graph.color = Väri +commit_graph.hide_pr_refs = Piilota vetopyynnöt +executable_file = Suoritettava tiedosto +editor.file_already_exists = Tiedosto nimeltä "%s" on jo olemassa tässä repossa. +branch.restore = Palauta haara "%s" +branch.default_deletion_failed = Haara "%s" on oletushaara. Sitä ei voi poistaa. +branch.new_branch = Luo uusi haara +tag.create_success = Tagi "%s" luotu. +issues.sign_in_require_desc = Kirjaudu sisään liittyäksesi keskusteluun. +wiki.cancel = Peruuta +issues.dependency.remove_header = Poista riippuvuus +issues.dependency.issue_remove_text = Riippuvuus poistetaan tästä ongelmasta. Jatketaanko? +issues.dependency.pr_remove_text = Riippuvuus poistetaan tästä vetopyynnöstä. Jatketaanko? +release.download_count_few = %s latausta +diff.data_not_available = Diff-sisältö ei ole saatavilla +diff.image.side_by_side = Rinnakkain +release.ahead.target = projektiin %s tämän julkaisun jälkeen +issues.close = Sulje ongelma +issues.no_content = Ei kuvausta. +pulls.reject_count_1 = %d muutospyyntö +pulls.update_branch_success = Haarapäivitys onnistui +milestones.completeness = %d%% valmiina +contributors.contribution_type.additions = Lisäykset +contributors.contribution_type.deletions = Poistot +settings.webhook_deletion_success = Webkoukku on poistettu. +settings.event_pull_request_milestone = Merkkipaalut +find_file.no_matching = Vastaavaa tiedostoa ei löytynyt +editor.file_delete_success = Tiedosto "%s" on poistettu. +settings.transfer.button = Siirrä omistajuus +settings.slack_color = Väri +release.tag_name_already_exist = Julkaisu tällä taginimellä on jo olemassa. +pulls.allow_edits_from_maintainers_err = Päivittäminen epäonnistui +stars = Tähdet +editor.branch_already_exists = Haara "%s" on jo olemassa tässä repossa. +projects.column.delete = Poista sarake +projects.column.color = Väri +settings.admin_settings = Ylläpitäjän asetukset +file_too_large = Tiedosto on liian suuri näytettäväksi. +readme_helper = Valitse README-tiedoston mallipohja +settings.default_merge_style_desc = Oletusarvoinen yhdistämistyyli +wiki.back_to_wiki = Takaisin wikisivulle +wiki.delete_page_notice_1 = Wikisivun "%s" poistamista ei voi perua. Jatketaanko? +activity.merged_prs_count_1 = yhdistetty vetopyyntö +activity.merged_prs_count_n = yhdistettyä vetopyyntöä +activity.opened_prs_count_1 = ehdotettu vetopyyntö +activity.opened_prs_count_n = ehdotettua vetopyyntöä +activity.title.user_1 = %d käyttäjä +activity.title.prs_n = %d vetopyyntöä +settings.sourcehut_builds.secrets = Salaisuudet +commit_graph = Kommittikaavio +visibility_helper = Tee reposta yksityinen +pulls.approve_count_1 = %d hyväksyntä +settings.confirm_delete = Poista repositorio +milestones.new_subheader = Merkkipaalut auttavat hallinnoimaan ongelmia ja seuraamaan niiden korjausten edistymistä. +activity.title.user_n = %d käyttäjää +activity.title.prs_1 = %d vetopyyntö +activity.navbar.code_frequency = Koodifrekvenssi +activity.navbar.pulse = Pulssi +wiki.no_search_results = Ei tuloksia +settings.federation_settings = Federaation asetukset +pull.deleted_branch = (poistettu):%s +settings.transfer.rejected = Repositorion siirto hylättiin. +settings.transfer.modal.title = Siirrä omistajuus +settings.event_pull_request_sync = Synkronoitu +editor.commit_empty_file_text = Tiedosto, jonka olet aikeissa kommitoida, on tyhjä. Jatketaanko? +diff.load = Lataa diff +branch.create_branch_operation = Luo haara +activity.title.releases_n = %d julkaisua +projects.column.new = Uusi sarake +projects.column.new_submit = Luo sarake +issues.new.open_projects = Avoimet projektit +issues.filter_project_all = Kaikki projektit +milestones.update_ago = Päivitetty %s +pulls.update_not_allowed = Sinulla ei ole oikeutta päivittää haaraa +pulls.is_closed = Vetopyyntö on suljettu. +pulls.cannot_merge_work_in_progress = Vetopyyntö on merkitty keskeneräiseksi. +pulls.still_in_progress = Vielä keskeneräinen? +pulls.expand_files = Laajenna kaikki tiedostot +issues.content_history.delete_from_history = Poista historiasta +milestones.filter_sort.name = Nimi +issues.filter_milestone_all = Kaikki merkkipaalut +issues.filter_label_select_no_label = Ei tunnistetta +projects.column.set_default = Aseta oletukseksi +projects.edit_success = Projekti "%s" on päivitetty. +desc.sha256 = SHA256 +n_commit_one = %s kommitti +transfer.accept = Hyväksy siirto +transfer.reject = Hylkää siirto +default_branch_label = oletus +repo_desc_helper = Kirjoita lyhyt kuvaus (valinnainen) +create_new_repo_command = Uuden repon luominen komentoriviltä +subscribe.issue.guest.tooltip = Kirjaudu sisään tilataksesi tämän ongelman päivitykset. +subscribe.pull.guest.tooltip = Kirjaudu sisään tilataksesi tämän vetopyynnön päivitykset. +migrate.migrating_failed_no_addr = Migraatio epäonnistui. +need_auth = Valtuutus +migrate_options = Migraatioasetukset +projects.create_success = Projekti "%s" on luotu. +projects.description = Kuvaus (valinnainen) +editor.commit_empty_file_header = Kommitoi tyhjä tiedosto +editor.branch_does_not_exist = Haaraa "%s" ei ole olemassa repossa. +editor.delete = Poista %s +editor.patching = Paikkaus: +editor.patch = Toteuta paikkaus +issues.filter_poster_no_select = Kaikki tekijät +issues.filter_project_none = Ei projektia +issues.new.no_projects = Ei projektia +projects.card_type.text_only = Vain teksti +issues.comment_on_locked = Et voi kommentoida lukittua ongelmaa. +pulls.collapse_files = Supista kaikki tiedostot +pulls.view = Näytä vetopyynnöt +issues.dependency.add_error_dep_not_exist = Riippuvuutta ei ole olemassa. +pulls.reject_count_n = %d muutospyyntöä +pulls.waiting_count_1 = %d odottava katselmointi +pulls.waiting_count_n = %d odottavaa katselmointia +pulls.approve_count_n = %d hyväksyntää +pulls.num_conflicting_files_n = %d ristiriitaista tiedostoa +pulls.closed = Vetopyyntö suljettu +milestones.create_success = Merkkipaalu "%s" on luotu. +milestones.edit_success = Merkkipaalu "%s" on päivitetty. +milestones.filter_sort.least_complete = Vähiten valmis +milestones.filter_sort.most_complete = Eniten valmis +activity.title.releases_1 = %d julkaisu +settings.branches.update_default_branch = Päivitä oletushaara +settings.transfer.success = Repositorion siirto onnistui. +settings.transfer_abort = Peru siirto +settings.sync_mirror = Synkronoi nyt +settings.mirror_settings.docs.doc_link_title = Miten peilaan repoja? +tag.create_tag_operation = Luo tagi +branch.rename = Nimeä haara "%s" uudelleen +branch.download = Lataa haara "%s" +branch.deleted_by = Poistanut %s +branch.create_success = Haara "%s" on luotu. +branch.delete = Poista haara "%s" +release.add_tag = Luo tagi +diff.show_diff_stats = Näytä tilastot +settings.rename_branch = Nimeä haara uudelleen +settings.rename_branch_success = Haaran %s uudeksi nimeksi asetettiin %s. +settings.rename_branch_failed_not_exist = Haaraa %s ei voi nimetä uudelleen, koska sitä ei ole olemassa. +readme_helper_desc = Tähän voit kirjoittaa projektisi koko kuvauksen. +milestones.deletion = Poista merkkipaalu +more_operations = Lisää toimintoja +settings.branches.switch_default_branch = Vaihda oletushaara +tag.confirm_create_tag = Luo tagi +n_tag_one = %s tagi +branch.renamed = Haaran %s uudeksi nimeksi asetettiin %s. +release.tag_name_protected = Tagin nimi on suojattu. +pulls.merge_conflict_summary = Virheviesti +issues.delete.title = Poistetaanko tämä ongelma? +migrate.github.description = Tee datamigraatio github.comista tai GitHub Enterprise -palvelimelta. +settings.merge_style_desc = Yhdistämistyylit +settings.protected_branch_deletion = Poista haaran suojaus +settings.deletion_success = Repositorio on poistettu. +editor.filename_is_invalid = Tiedoston nimi on virheellinen: "%s". +push_exist_repo = Olemassa olevan repon työntäminen komentoriviltä +issues.new.title_empty = Otsikko ei voi olla tyhjä +settings.transfer_perform = Suorita siirto +activity.git_stats_pushed_n = on työntänyt +settings.mirror_settings.last_update = Viimeisin päivitys +settings.new_owner_blocked_doer = Uusi omistaja on estänyt sinut. +issues.lock_duplicate = Ongelmaa ei voi lukita kahdesti. +ext_wiki = Ulkoinen wiki +wiki.file_revision = Sivun versio +stored_lfs = Talletettu Git LFS:llä +activity.git_stats_author_1 = %d tekijä +issues.choose.blank_about = Luo ongelma oletusarvoisesta mallipohjasta. +pulls.made_using_agit = AGit +editor.cannot_edit_lfs_files = LFS-tiedostoja ei voi muokata web-käyttöliittymässä. +pulls.cmd_instruction_hint = Näytä komentoriviohjeet +settings.wiki_globally_editable = Salli kenen tahansa muokata wikiä +pulls.rebase_conflict_summary = Virheviesti +wiki.search = Etsi wikistä +activity.commit = Kommittitoiminta +editor.cannot_edit_non_text_files = Binääritiedostoja ei voi muokata web-käyttöliittymässä. +projects.template.desc_helper = Valitse projektin mallipohja aloittaaksesi +commit.contained_in_default_branch = Tämä kommitti on osa oletushaaraa +activity.git_stats_exclude_merges = Poissulkien yhdistämiset +activity.no_git_activity = Tällä ajanjaksolla ei ole ollut kommitointitoimintaa. +activity.git_stats_commit_1 = %d kommitin +activity.git_stats_push_to_all_branches = kaikkiin haaroihin. +settings.graphql_url = GraphQL:n URL-osoite +branch.create_new_branch = Luo haara haarasta: +settings.archive.error_ismirror = Et voi arkistoida peilattua repoa. +branch.warning_rename_default_branch = Olet nimeämässä oletushaaran uudelleen. +settings.web_hook_name_msteams = Microsoft Teams +release.download_count_one = %s lataus +settings.update_hook_success = Webkoukku on päivitetty. +diff.file_before = Ennen +diff.file_after = Jälkeen +settings.protect_new_rule = Luo uusi haaran suojaussääntö +settings.branch_filter = Haarasuodatin [graphs] +component_loading_info = Tämä saattaa kestää hetken… +component_failed_to_load = Odottamaton virhe. +component_loading = Ladataan %s... [org] -org_name_holder=Organisaatio -org_full_name_holder=Organisaation täydellinen nimi +org_name_holder=Organisaation nimi +org_full_name_holder=Organisaation koko nimi org_name_helper=Organisaation nimen tulisi olla lyhyt ja mieleenpainuva. create_org=Luo organisaatio repo_updated=Päivitetty %s @@ -1471,7 +1812,7 @@ team_unit_desc=Salli pääsy repon osioihin settings=Asetukset settings.options=Organisaatio -settings.full_name=Kokonimi +settings.full_name=Koko nimi settings.website=Nettisivu settings.location=Sijainti settings.permission=Käyttöoikeudet @@ -1514,7 +1855,7 @@ teams.admin_access_helper=Tiimin jäsenet voivat työntää (push) ja vetää (p teams.no_desc=Tällä tiimillä ei ole kuvausta teams.settings=Asetukset teams.owners_permission_desc=Omistajilla on täydet käyttöoikeudet kaikkiin organisaation repoihin sekä organisaation ylläpitäjän oikeudet. -teams.members=Ryhmän jäsenet +teams.members=Tiimin jäsenet teams.update_settings=Päivitä asetukset teams.delete_team=Poista tiimi teams.add_team_member=Lisää tiimin jäsen @@ -1527,6 +1868,21 @@ teams.admin_permission_desc=Tämä tiimi myöntää jäsenille Ylläpito teams.repositories=Tiimin repot teams.members.none=Ei jäseniä tässä tiimissä. teams.all_repositories=Kaikki repot +teams.invite.by = Kutsunut %s +members.leave.detail = Haluatko varmasti poistua organisaatiosta "%s"? +teams.add_all_repos_title = Lisää kaikki repot +teams.invite_team_member.list = Odottavat kutsut +teams.invite.description = Napsauta alla olevaa painiketta liittyäksesi tiimiin. +settings.update_setting_success = Organisaatioasetukset on päivitetty. +form.create_org_not_allowed = Sinulla ei ole oikeutta luoda organisaatiota. +teams.leave.detail = Haluatko varmasti poistua tiimistä "%s"? +teams.invite.title = Sinut on kutsuttu tiimiin %s organisaatiossa %s. +teams.add_duplicate_users = Käyttäjä on jo tiimijäsen. +settings.visibility.limited = Rajattu (näkyvissä vain tunnistautuneille käyttäjille) +code = Koodi +teams.remove_all_repos_title = Poista kaikki tiimin repot +form.name_reserved = Organisaation nimi "%s" on varattu. +settings.delete_org_desc = Organisaatio poistetaan pysyvästi. Jatketaanko? [admin] dashboard=Kojelauta @@ -1578,10 +1934,10 @@ dashboard.total_gc_pause=Yhteensä GC tauko dashboard.last_gc_pause=Viime GC tauko dashboard.gc_times=GC aikoja -users.user_manage_panel=Tilien hallinta +users.user_manage_panel=Käyttäjätilien hallinta users.new_account=Luo käyttäjätili users.name=Käyttäjätunnus -users.full_name=Kokonimi +users.full_name=Koko nimi users.activated=Aktivoitu users.admin=Ylläpito users.restricted=Rajoitettu @@ -1595,16 +1951,16 @@ users.auth_source=Todennuslähde users.local=Paikallinen users.password_helper=Jätä salasanakenttä tyhjäksi jos haluat pitää sen muuttamattomana. users.update_profile_success=Käyttäjän tili on päivitetty. -users.edit_account=Muokkaa käyttäjän tiliä +users.edit_account=Muokkaa käyttäjätiliä users.max_repo_creation_desc=(Aseta -1 käyttääksesi globaalia oletusrajaa.) users.is_activated=Käyttäjätili on aktivoitu users.prohibit_login=Ota sisäänkirjautuminen pois käytöstä -users.is_admin=Ylläpitäjä +users.is_admin=Ylläpitäjätili users.is_restricted=Rajoitettu tili -users.allow_git_hook=Voi luoda Git koukkuja +users.allow_git_hook=Voi luoda Git-koukkuja users.allow_create_organization=Voi luoda organisaatioita -users.update_profile=Päivitä käyttäjän tili -users.delete_account=Poista käyttäjän tili +users.update_profile=Päivitä käyttäjätili +users.delete_account=Poista käyttäjätili users.list_status_filter.menu_text=Suodata users.list_status_filter.reset=Tyhjennä users.list_status_filter.is_active=Aktiivinen @@ -1670,11 +2026,11 @@ auths.search_page_size=Sivukoko auths.filter=Käyttäjäsuodatin auths.admin_filter=Ylläpitosuodatin auths.restricted_filter=Rajoitettu suodatin -auths.smtp_auth=SMTP todennustyyppi -auths.smtphost=SMTP isäntä -auths.smtpport=SMTP portti +auths.smtp_auth=SMTP-todennustyyppi +auths.smtphost=SMTP-isäntä +auths.smtpport=SMTP-portti auths.allowed_domains=Sallitut verkkotunnukset -auths.skip_tls_verify=Ohita TLS tarkistaminen +auths.skip_tls_verify=Ohita TLS-vahvistus auths.pam_service_name=PAM palvelun nimi auths.oauth2_tokenURL=Pääsymerkki URL auths.enable_auto_register=Ota käyttöön automaattinen rekisteröinti @@ -1688,17 +2044,17 @@ auths.delete_auth_title=Todennuslähteen poisto auths.delete_auth_desc=Todennuslähteen poisto estää käyttäjiä käyttämästä sitä kirjautumiseen. Jatketaanko? auths.deletion_success=Todennuslähde on poistettu. -config.server_config=Palvelin asetukset -config.app_name=Sivuston otsikko -config.app_ver=Forgejo versio +config.server_config=Palvelimen asetukset +config.app_name=Instanssin otsikko +config.app_ver=Forgejo-versio config.disable_router_log=Poista käytöstä reitittimen loki config.run_mode=Suoritustila -config.git_version=Git versio +config.git_version=Git-versio config.repo_root_path=Repon juuren polku config.script_type=Komentosarjan tyyppi config.reverse_auth_user=Käänteinen todennus käyttäjä -config.ssh_config=SSH asetukset +config.ssh_config=SSH-asetukset config.ssh_enabled=Käytössä config.ssh_port=Portti config.ssh_listen_port=Kuuntele porttia @@ -1718,24 +2074,24 @@ config.db_user=Käyttäjätunnus config.db_ssl_mode=SSL config.db_path=Polku -config.service_config=Palvelu asetukset -config.show_registration_button=Näytä rekisteröidy painike +config.service_config=Palveluasetukset +config.show_registration_button=Näytä rekisteröitymispainike config.enable_captcha=Ota CAPTCHA käyttöön -config.active_code_lives=Aktiivinen koodi elämät ennen vanhenemista +config.active_code_lives=Aktivointikoodin vanhenemisaika config.default_keep_email_private=Piilota sähköpostiosoitteet oletuksena config.default_visibility_organization=Uuden organisaation oletusnäkyvyys -config.webhook_config=Webkoukku asetukset +config.webhook_config=Webkoukkujen asetukset config.queue_length=Jonon pituus config.deliver_timeout=Toimitus aikakatkaisu config.mailer_enabled=Käytössä config.mailer_name=Nimi -config.mailer_smtp_addr=SMTP osoite -config.mailer_smtp_port=SMTP portti +config.mailer_smtp_addr=SMTP-isäntä +config.mailer_smtp_port=SMTP-portti config.mailer_user=Käyttäjä -config.oauth_config=OAuth asetukset +config.oauth_config=OAuth-asetukset config.oauth_enabled=Käytössä config.cache_config=Välimuistin asetukset @@ -1752,7 +2108,7 @@ config.session_life_time=Istunnon elinikä config.https_only=Vain HTTPS config.cookie_life_time=Evästeen elinikä -config.picture_service=Kuva palvelu +config.picture_service=Kuvapalvelu config.disable_gravatar=Poista käytöstä Gravatar config.git_gc_args=Roskienkeruun parametrit @@ -1761,12 +2117,12 @@ config.git_mirror_timeout=Peilauspäivitys aikakatkaistiin config.git_clone_timeout=Kloonaus aikakatkaistiin config.git_gc_timeout=Roskienkeruu aikakatkaistiin -config.log_config=Loki asetukset +config.log_config=Lokiasetukset config.disabled_logger=Pois käytöstä -monitor.cron=Cron tehtävät +monitor.cron=Cron-tehtävät monitor.name=Nimi monitor.schedule=Aikataulu monitor.next=Seuraava aika @@ -1792,6 +2148,79 @@ notices.type=Tyyppi notices.type_1=Repo notices.desc=Kuvaus notices.op=Toiminta +auths.sspi_auto_create_users = Luo käyttäjät automaattisesti +integrations = Integraatiot +emails.change_email_header = Päivitä sähköpostiominaisuudet +emails.change_email_text = Haluatko varmasti päivittää tämän sähköpostiosoitteen? +emails.updated = Sähköpostiosoite päivitetty +users.organization_creation.description = Salli uusien organisaatioiden luonti. +users.deletion_success = Käyttäjätili on poistettu. +users.reset_2fa = Nollaa 2FA +packages.published = Julkaistu +packages.version = Versio +auths.tip.oauth2_provider = OAuth2-palveluntarjoaja +hooks = Webkoukut +identity_access = Identiteetti ja pääsy +config.test_email_placeholder = Sähköposti (esim. test@example.com) +auths.force_smtps = Pakota SMTPS +config.mailer_use_sendmail = Käytä Sendmailia +users.new_success = Käyttäjätili "%s" on luotu. +config.disable_register = Poista itserekisteröinti käytöstä +config.enable_openid_signin = Käytä OpenID-kirjautumista +config.enable_openid_signup = Käytä OpenID-itserekisteröintiä +monitor.queue.settings.changed = Asetukset päivitetty +config.db_schema = Skeema +settings = Ylläpitäjän asetukset +emails.delete = Poista sähköpostiosoite +emails.deletion_success = Sähköpostiosoite on poistettu. +emails.delete_desc = Haluatko varmasti poistaa tämän sähköpostiosoitteen? +users.cannot_delete_self = Et voi poistaa itseäsi +packages.package_manage_panel = Hallitse paketteja +config.ssh_start_builtin_server = Käytä sisäänrakennettua palvelinta +notices.type_2 = Tehtävä +emails.delete_primary_email_error = Et voi poistaa ensisijaista sähköpostiosoitetta. +users.details = Käyttäjän tiedot +config_summary = Yhteenveto +config.send_test_mail = Lähetä testisähköposti +auths.oauth2_icon_url = Kuvakkeen URL-osoite +config.mail_notify = Käytä sähköposti-ilmoituksia +config.send_test_mail_submit = Lähetä +systemhooks = Järjestelmän webkoukut +packages.total_size = Koko yhteensä: %s +auths.oauth2_provider = OAuth2-palveluntarjoaja +auths.tips.gmail_settings = Gmail-asetukset: +config.mailer_sendmail_path = Sendmail-polku +auths.sspi_default_language = Käyttäjän oletuskieli +config_settings = Asetukset +monitor.queue.settings.remove_all_items = Poista kaikki +config.skip_tls_verify = Ohita TLS-vahvistus +auths.sspi_auto_activate_users = Aktivoi käyttäjät automaattisesti +dashboard.new_version_hint = Forgejo %s on nyt saatavilla. Käytössäsi on %s. Lue lisätietoja blogista. +defaulthooks.add_webhook = Lisää oletusarvoinen webkoukku +monitor.execute_times = Suoritukset +defaulthooks = Oletusarvoiset webkoukut +systemhooks.update_webhook = Päivitä järjestelmän webkoukku +systemhooks.add_webhook = Lisää järjestelmän webkoukku +config.domain = Palvelimen verkkotunnus +monitor.process.cancel = Peru prosessi +config.allow_only_internal_registration = Salli rekisteröinti vain Forgejon kautta +config.allow_only_external_registration = Salli rekisteröinti vain ulkoisten palvelujen kautta +config.require_sign_in_view = Vaadi sisäänkirjautuminen sisällön katselemiseksi +config.git_config = Git-asetukset +monitor.stats = Tilastot +repos.lfs_size = LFS:n koko +config.lfs_config = LFS-asetukset +config.register_email_confirm = Vaadi sähköpostivahvistus rekisteröitymiseen +config.ssh_domain = SSH-palvelimen verkkotunnus +config.app_slogan = Instanssin tunnuslause +config.lfs_content_path = LFS-sisällön polku +users.max_repo_creation = Repojen enimmäismäärä +defaulthooks.update_webhook = Päivitä oletusarvoinen webkoukku +auths.auth_manage_panel = Todennuslähteiden hallinta +config.custom_conf = Asetustiedoston polku +config.reset_password_code_lives = Palautuskoodin vanhenemisaika +monitor.processes_count = %d prosessia +config.default_allow_create_organization = Salli organisaatioiden luominen oletuksena [action] @@ -1804,6 +2233,7 @@ compare_commits_general=Vertaa committeja create_branch=loi haaran %[3]s repossa %[4]s compare_commits = Vertaa %d kommittia compare_branch = Vertaa +review_dismissed_reason = Syy: [tool] now=nyt @@ -1839,10 +2269,15 @@ pin=Merkitse ilmoitus mark_as_read=Merkitse luetuksi mark_as_unread=Merkitse lukemattomaksi mark_all_as_read=Merkitse kaikki luetuiksi +watching = Tarkkaillaan +no_subscriptions = Ei tilauksia +subscriptions = Tilaukset [gpg] error.no_committer_account=Committaajan sähköpostiosoitteeseen ei ole linkitetty tiliä error.not_signed_commit=Ei allekirjoitettu committi +error.extract_sign = Allekirjoituksen purkaminen epäonnistui +default_key = Allekirjoitettu oletusavaimella [units] @@ -1859,8 +2294,99 @@ alpine.repository.branches=Haarat alpine.repository.repositories=Repot conan.details.repository=Repo owner.settings.cleanuprules.enabled=Käytössä +details.license = Lisenssi +about = Tietoja tästä paketista +debian.install = Asenna paketti seuraavalla komennolla: +owner.settings.cleanuprules.edit = Muokkaa siivoussääntöä +arch.version.groups = Ryhmä +details.project_site = Projektin verkkosivusto +details.repository_site = Repositorion verkkosivusto +container.pull = Vedä levykuva komentoriviltä: +generic.download = Lataa paketti komentoriviltä: +dependency.version = Versio +keywords = Avainsanat +dependencies = Riippuvuudet +container.labels.key = Avain +container.labels.value = Arvo +pypi.install = Asenna paketti pipillä seuraavalla komennolla: +npm.install = Asenna paketti npm:llä seuraavalla komennolla: +npm.install2 = tai lisää se package.json-tiedostoon: +empty.documentation = Lisätietoja pakettirekisteristä on saatavilla dokumentaatiossa. +helm.install = Asenna paketti seuraavalla komennolla: +owner.settings.chef.keypair = Luo avainpari +settings.delete.error = Paketin poistaminen epäonnistui. +requirements = Vaatimukset +published_by_in = Julkaistu %[1]s, julkaisija %[3]s projektissa %[5]s +pypi.requires = Vaatii Pythonin +alpine.install = Asenna paketti seuraavalla komennolla: +debian.repository.components = Komponentit +cran.install = Asenna paketti seuraavalla komennolla: +settings.link.select = Valitse repo +owner.settings.chef.title = Chef-rekisteri +owner.settings.cleanuprules.add = Lisää siivoussääntö +versions = Versiot +versions.view_all = Näytä kaikki +debian.repository.architectures = Arkkitehtuurit +container.details.type = Levykuvan tyyppi +arch.version.properties = Version ominaisuudet +rpm.install = Asenna paketti seuraavalla komennolla: +owner.settings.cleanuprules.none = Siivoussääntöjä ei vielä ole. +container.details.platform = Alusta +npm.dependencies = Riippuvuudet +owner.settings.cleanuprules.title = Siivoussäännöt +arch.version.depends = Riippuu +settings.delete = Poista paketti +arch.version.description = Kuvaus +settings.delete.success = Paketti on poistettu. +npm.dependencies.optional = Valinnaiset riippuvuudet +debian.repository.distributions = Jakelut +composer.dependencies = Riippuvuudet +chef.install = Asenna paketti seuraavalla komennolla: +details.documentation_site = Dokumentaation verkkosivusto +go.install = Asenna paketti komentoriviltä: +alpine.repository.architectures = Arkkitehtuurit +composer.registry = Määritä tämä rekisteri ~/.composer/config.json-tiedostossa: +debian.registry = Määritä tämä rekisteri komentoriviltä: +rpm.registry = Määritä rekisteri komentoriviltä: +maven.install = Käytä pakettia sisällyttämällä seuraava dependencies-lohkoon pom.xml-tiedostossa: +npm.registry = Määritä rekisteri projektin .npmrc-tiedostossa: +alpine.repository = Repositorion tiedot +cargo.registry = Määritä tämä rekisteri Cargon asetustiedostossa (esimerkiksi ~/.cargo/config.toml): +cargo.install = Asenna paketti Cargolla suorittamalla seuraava komento: +composer.install = Asenna paketti Composerilla suorittamalla seuraava komento: +rpm.distros.redhat = RedHatiin pohjautuvilla jakeluilla +rpm.distros.suse = SUSE:en pohjautuvilla jakeluilla +rpm.repository.architectures = Arkkitehtuurit +cran.registry = Määritä rekisteri Rprofile.site-tiedostossa: +swift.install2 = ja suorita seuraava komento: +maven.registry = Määritä tämä rekisteri projektin pom.xml-tiedostossa: +maven.install2 = Suorita komentoriviltä: +nuget.registry = Määritä rekisteri komentoriviltä: +nuget.install = Asenna paketti NuGetillä suorittamalla seuraava komento: +rubygems.install = Asenna paketti gemillä suorittamalla seuraava komento: +rubygems.install2 = tai lisää se Gemfileen: +swift.registry = Määritä rekisteri komentoriviltä: +swift.install = Lisää paketti Package.swift-tiedostoon: +owner.settings.cleanuprules.keep.count.1 = 1 versio per paketti +owner.settings.cleanuprules.keep.count.n = %d versiota per paketti +conan.install = Asenna paketti Conanilla suorittamalla seuraava komento: +chef.registry = Määritä tämä rekisteri ~/.chef/config.rb-tiedostossa: +conan.registry = Määritä tämä rekisteri komentoriviltä: +conda.install = Asenna paketti Condalla suorittamalla seuraava komento: +helm.registry = Määritä tämä rekisteri komentoriviltä: +pub.install = Asenna paketti Dartilla suorittamalla seuraava komento: [secrets] +creation.failed = Salaisuuden lisääminen epäonnistui. +deletion = Poista salaisuus +creation.success = Salaisuus "%s" on päivitetty. +creation = Lisää salaisuus +none = Ei salaisuuksia vielä. +management = Hallitse salaisuuksia +deletion.failed = Salaisuuden poistaminen epäonnistui. +secrets = Salaisuudet +deletion.description = Salaisuuden poistaminen on pysyvä toimenpide, eikä sitä voi perua. Jatketaanko? +deletion.success = Salaisuus on poistettu. [actions] @@ -1903,7 +2429,7 @@ runners.delete_runner_failed = Testinajajan poisto epäonnistui runners.delete_runner_header = Varmista testinajajan poisto runners.task_list.status = Tila runners.reset_registration_token_success = Testiajajan rekisteröintiavain uudelleenasetettu onnistuneesti -variables.none = Muuttujia ei ole vielä määritelty. +variables.none = Ei muuttujia vielä. runners.id = Tunniste runners.status = Tila runners.task_list = Ajajan viimeisimmät tehtävät @@ -1935,6 +2461,19 @@ variables.creation.failed = Muuttujan lisäys epäonnistui. variables.update.failed = Muuttujan muokkaus epäonnistui. variables.update.success = Muuttuja muokattu. variables.id_not_exist = Muuttujaa tunnisteella %d ei ole olemassa. +runs.all_workflows = Kaikki työnkulut +workflow.dispatch.run = Suorita työnkulku +workflow.enable = Käytä työnkulkua +runs.no_workflows = Ei työnkulkuja vielä. +runs.actors_no_select = Kaikki toimijat +runs.workflow = Työnkulku +workflow.enable_success = Työnkulku "%s" otettu käyttöön. +workflow.disabled = Työnkulku on poistettu käytöstä. +runs.actor = Toimija +workflow.disable = Poista työnkulku käytöstä +workflow.disable_success = Työnkulku "%s" on poistettu käytöstä. +runs.no_job = Työnkulun tulee sisältää vähintään yksi työ +runs.invalid_workflow_helper = Työnkulun asetustiedosto on virheellinen. Tarkista asetustiedosto: %s @@ -1977,4 +2516,5 @@ branch_kind = Etsi haaroja... issue_kind = Etsi ongelmia... milestone_kind = Etsi merkkipaaluja... pull_kind = Etsi pull-vetoja... -commit_kind = Etsi kommitteja... \ No newline at end of file +commit_kind = Etsi kommitteja... +fuzzy = Sumea \ No newline at end of file diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index c6a3557475..e26a36867d 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -3291,7 +3291,7 @@ auths.tips=Conseils auths.tips.oauth2.general=Authentification OAuth2 auths.tips.oauth2.general.tip=Lors de l'enregistrement d'une nouvelle authentification OAuth2, l'URL de rappel/redirection doit être : auths.tip.oauth2_provider=Fournisseur OAuth2 -auths.tip.bitbucket=`Créez un nouveau jeton OAuth sur %s +auths.tip.bitbucket=Créez un nouveau jeton OAuth sur %s auths.tip.nextcloud=`Enregistrez un nouveau consommateur OAuth sur votre instance en utilisant le menu "Paramètres -> Sécurité -> Client OAuth 2.0"` auths.tip.dropbox=Créez une nouvelle application sur %s auths.tip.facebook=`Enregistrez une nouvelle application sur %s et ajoutez le produit "Facebook Login"` diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index 2fe7495c43..fd6d48d8b0 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -493,7 +493,7 @@ avatar=Profilkép ssh_gpg_keys=SSH / GPG kulcsok social=Közösségi fiókok applications=Alkalmazások -orgs=Szervezetek kezelése +orgs=Szervezetek repos=Tárolók delete=Fiók törlése twofa=Kétlépcsős hitelesítés @@ -665,6 +665,7 @@ email_notifications.submit=E-mail beállítások megadása visibility.public=Nyilvános visibility.private=Privát +appearance = Megjelenés [repo] owner=Tulajdonos diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index 32aded1935..f59e0151a3 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -335,6 +335,7 @@ oauth.signin.error = Bi’m Verarbeiden vun de Anmellens-Anfraag is een Fehler u openid_connect_desc = De utköört OpenID-URI is unbekannt. Verbinn dat hier mit eenem nejen Konto. openid_signin_desc = Giff diene OpenID-URI in. To’n Bispööl: alice.openid.example.org of https://openid.example.org/alice. password_pwned = Dat Passwoord, wat du utköört hest, is up eener List vun klaut Passwoorden, wat tovör in publiken Datenbröken blootmaakt worden is. Bidde versöök dat noch eenmaal mit eenem anner Passwoord, un överlegg di, of du deeses Passwoord ok annerwaar ännern willst. +use_onetime_code = Een Eenmaal-Bruuk-Passwoord bruken [mail] view_it_on = Up %s wiesen @@ -1140,7 +1141,7 @@ editor.file_already_exists = Eene Datei mit de Naam »%s« gifft dat in deesem R editor.commit_id_not_matching = De Datei is ännert worden, as du se bewarkt hest. Kommitteer up eenen nejen Twieg un föhr dann tosamen. editor.push_out_of_date = De Schuuv schient verollt to wesen. editor.commit_empty_file_header = Eene lege Datei kommitteren -editor.no_changes_to_show = 't gifft keene Ännerns to wiesen. +editor.no_changes_to_show = ’t gifft keene Ännerns to wiesen. editor.fail_to_update_file_summary = Fehler-Naricht: editor.push_rejected_summary = Kumpleete Oflehnens-Naricht: editor.add_subdir = Verteeknis hentofögen … @@ -1526,7 +1527,7 @@ issues.review.dismissed_label = Ofseggt issues.review.left_comment = hett kommenteert issues.review.content.empty = Du muttst eenen Kommentaar geven, wat för Ännerns du hebben willst. issues.review.reject = hett %s um Ännerns beden -issues.review.remove_review_request = hett de Nakieken-Anfraag för %s %s wegdaan +issues.review.remove_review_request = hett %[2]s de Nakieken-Anfraag för %[1]s wegdaan issues.review.remove_review_request_self = hett %s dat Nakieken verweigert issues.unlock_error = Kann een Gefall nich upsluten, wenn ’t nich tosloten is. issues.lock_with_reason = hett dat um %s %s tosluten un Snack up Mitarbeiders begrenzt @@ -1567,7 +1568,7 @@ issues.review.option.hide_outdated_comments = Verollte Kommentarens verbargen issues.due_date_form = JJJJ-MM-DD issues.dependency.added_dependency = `hett %s eene neje Ofhangen hentoföögt` issues.review.wait = is %s um een Nakieken anfraggt worden -issues.review.add_review_request = hett um een Nakieken vun %s %s anfraggt +issues.review.add_review_request = hett %[2]s um een Nakieken vun %[1]s anfraggt issues.review.show_outdated = Wies verollt issues.review.hide_outdated = Verbarg verollt issues.content_history.options = Instellens @@ -2524,11 +2525,17 @@ settings.sourcehut_builds.access_token_helper = Togang-Teken, wat de Verlöövni settings.protect_unprotected_file_patterns_desc = Nich schütt Dateien, wat stracks ännert worden düren, wenn de Bruker Schriev-Togriep hett, an de Schuuv-Schüttens-Örders vörbi. Mennig Musters könen mit Semikolon (»;«) trennt worden. Kiek de Dokumenteren för ">%[2]s för de Syntax an. Bispölen: .drone.yml, /docs/**/*.txt. settings.protected_branch_required_rule_name = Ördernaam is nödig settings.protect_protected_file_patterns_desc = Schütt Dateien, wat nich stracks ännert worden düren, sülvst wenn de Bruker dat Recht hett, Dateien in deesem Twieg hentotofögen, to bewarken of to lösken. Mennig Musters könen mit Semikolon (»;«) trennt worden. Kiek de Dokumenteren för ">%[2]s för de Syntax an. Bispölen: .drone.yml, /docs/**/*.txt. -settings.branch_filter_desc = Twieg-Verlöövnis-List för Vörfallen över dat Schuven un dat Maken un Lösken vun Twiegen, angeven as een Glob-Muster. Wenn leeg of * worden Vörfallen för all Twiegen mellt. Kiek de Dokumenteren för ">%[2]s för de Syntax an. Bispölen: master, {master,release*}. +settings.branch_filter_desc = Twieg-Verlöövnis-List för Vörfallen över dat Schuven un dat Maken un Lösken vun Twiegen, angeven as een Glob-Muster. Wenn leeg of * worden Vörfallen för all Twiegen mellt. Kiek de Dokumenteren för %[2]s för de Syntax an. Bispölen: master, {master,release*}. settings.matrix.room_id_helper = De Ruum-ID kann vun de Element-Internett-Sied unner Ruum-Instellens → Verwiedert → Binnere Ruum-ID haalt worden. Bispööl: %s. settings.tags.protection.pattern.description = Du kannst eenen enkelt Naam bruken of een Glob-Muster of Regel-Utdruck, um up mennig Markens to passen. Lees mehr in de Inföhren över schütt Markens. error.broken_git_hook = Git-Hakens in deesem Repositorium schienen kaputt to wesen. Bidde folg de Dokumenteren, um se to repareren, dann schuuv een paar Kommitterens, um de Tostand to vernejen. settings.matrix.access_token_helper = Dat word anraden, daarföör eegens een Matrix-Konto intorichten. Dat Togangs-Teken kann in de Element-Internett-Sied (in eener privaaten/anonymen Karteikaart) unner Brukermenü (boven links) → All Instellens → Hülp & Över → Togangs-Teken (stracks unner de Heimaadserver-URL) haalt worden. Maak de privaate/anonyme Karteikaart dicht (wenn du di avmellst, word dat Teken ungültig). +issues.review.add_remove_review_requests = hett %[3]s um Nakiekens vun %[1]s anfraggt un de Nakiekens-Anfragen för %[2]s wegdaan +issues.review.add_review_requests = hett %[2]s um Nakiekens vun %[1]s anfraggt +issues.review.remove_review_requests = hett %[2]s de Nakieken-Anfragen för %[1]s wegdaan +pulls.delete_after_merge.head_branch.is_protected = De Kopp-Twieg, wat du lösken willst, is een schütt Twieg un kann nich lösket worden. +pulls.delete_after_merge.head_branch.insufficient_branch = Du hest nich dat Recht, de Kopp-Twieg to lösken. +pulls.delete_after_merge.head_branch.is_default = De Kopp-Twieg, wat du lösken willst, is de Höövd-Twieg un kann nich lösket worden. [repo.permissions] code.read = Lesen: De Quelltext vun deesem Repositorium ankieken un klonen. diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 27bbb885e9..cbf418f9be 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -659,7 +659,7 @@ unable_verify_ssh_key = Kan de SSH-sleutel niet verifiëren, controleer deze voo still_own_repo = Uw account is eigenaar van één of meer repositories, verwijder of draag deze eerst over. admin_cannot_delete_self = U kan uzelf niet verwijderen als u een beheerder bent. Verwijder eerst uw beheerdersrechten. username_error_no_dots = ` kan alleen alfanumerieke karakters ("0-9","a-z","A-Z"), streepje ("-") en liggend streepje ("_") bevatten. Niet-alfanumerieke karakters aan het begin of eind zijn verboden en aaneenvolgende niet alfanumerieke karakters zijn ook verboden.` -invalid_group_team_map_error = ` mapping is ongeldig: %s" +invalid_group_team_map_error = ` mapping is ongeldig: %s` org_still_own_repo = Deze organisatie is eigenaar van één of meer repositories, verwijder of draag deze eerst over. org_still_own_packages = Deze organisatie is eigenaar van één of meer pakketten, verwijder deze eerst. unset_password = De inloggebruiker heeft het wachtwoord niet ingesteld. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 2179e4fb33..73211f7139 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1752,8 +1752,8 @@ issues.review.left_comment=deixou um comentário issues.review.content.empty=Você precisa deixar um comentário indicando as alterações solicitadas. issues.review.reject=solicitou alterações %s issues.review.wait=foi solicitado(a) para revisar %s -issues.review.add_review_request=solicitou uma revisão de %s %s -issues.review.remove_review_request=removeu a solicitação de revisão para %s %s +issues.review.add_review_request=solicitou revisão de %[1]s %[2]s +issues.review.remove_review_request=removeu a solicitação de revisão para %[1]s %[2]s issues.review.remove_review_request_self=recusou-se a revisar %s issues.review.pending=Pendente issues.review.pending.tooltip=Este comentário não está atualmente visível para outros usuários. Para enviar seus comentários pendentes, selecione "%s" -> "%s/%s/%s" no topo da página. @@ -2827,6 +2827,9 @@ release.deletion_desc = Eliminar um release apenas o remove do Forgejo. Isso nã issues.all_title = Tudo issues.new.assign_to_me = Designar a mim settings.discord_icon_url.exceeds_max_length = A URL do ícone precisa ter 2048 caracteres ou menos +issues.review.add_review_requests = solicitou revisões de %[1]s %[2]s +issues.review.remove_review_requests = removeu pedidos de revisão para %[1]s %[2]s +issues.review.add_remove_review_requests = solicitou revisões de %[1]s e removeu pedidos de revisão para %[2]s %[3]s [graphs] diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index 59dcd6bffd..d368402a6a 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -476,6 +476,7 @@ hint_register = Precisa de uma conta? Faça uma inscrição agora.< sign_up_button = Faça uma inscrição agora. back_to_sign_in = Voltar ao iniciar a sessão sign_in_openid = Prosseguir com OpenID +unauthorized_credentials = As credenciais estão erradas ou expiraram. Tente o comando de novo ou veja %s para mais informação [mail] view_it_on=Ver em %s @@ -715,6 +716,7 @@ public_activity.visibility_hint.self_public = O seu trabalho está visível para public_activity.visibility_hint.admin_public = Este trabalho está visível para todos, mas como administrador/a pode também ver o que consta em espaços privados. public_activity.visibility_hint.self_private = O seu trabalho apenas está visível para si e para os administradores da instância. Configurar. public_activity.visibility_hint.admin_private = Este trabalho está visível para si porque é um/a administrador/a, mas o/a utilizador/a quer permanecer privado/a. +public_activity.visibility_hint.self_private_profile = O seu trabalho está visível somente para si e para os administradores da instância porque o seu perfil é privado. Configure. [settings] profile=Perfil @@ -1037,7 +1039,7 @@ hints = Sugestões blocked_users = Utilizadores bloqueados blocked_since = Bloqueado desde %s user_block_success = O utilizador foi bloqueado com sucesso. -additional_repo_units_hint_description = Mostrar um botão "Adicionar mais unidades..." para repositórios que não têm todas as unidades disponíveis habilitadas. +additional_repo_units_hint_description = Mostrar uma sugestão "Habilitar mais" para repositórios que não têm todas as unidades disponíveis habilitadas. update_hints_success = As sugestões foram modificadas. blocked_users_none = Não há utilizadores bloqueados. user_unblock_success = O utilizador foi desbloqueado com sucesso. @@ -1426,7 +1428,7 @@ commitstatus.failure=Falha commitstatus.pending=Pendente commitstatus.success=Sucesso -ext_issues=Acesso a questões externas +ext_issues=Questões externas ext_issues.desc=Ligação para um rastreador de questões externo. projects=Planeamentos @@ -1607,9 +1609,9 @@ issues.no_content=Nenhuma descrição fornecida. issues.close=Encerrar questão issues.comment_pull_merged_at=cometimento %[1]s integrado em %[2]s %[3]s issues.comment_manually_pull_merged_at=cometimento %[1]s integrado manualmente em %[2]s %[3]s -issues.close_comment_issue=Comentar e fechar +issues.close_comment_issue=Fechar com comentário issues.reopen_issue=Reabrir -issues.reopen_comment_issue=Comentar e reabrir +issues.reopen_comment_issue=Reabrir com comentário issues.create_comment=Comentar issues.closed_at=`encerrou esta questão %[2]s` issues.reopened_at=`reabriu esta questão %[2]s` @@ -1999,7 +2001,7 @@ signing.wont_sign.commitssigned=A integração não irá ser assinada, uma vez q signing.wont_sign.approved=A integração não irá ser assinada, uma vez que o pedido de integração não foi assinado. signing.wont_sign.not_signed_in=Não tem a sessão iniciada. -ext_wiki=Acesso a wiki externo +ext_wiki=Wiki externo ext_wiki.desc=Ligação para um wiki externo. wiki=Wiki @@ -2329,32 +2331,32 @@ settings.event_push_desc=Envio do Git para um repositório. settings.event_repository=Repositório settings.event_repository_desc=Repositório criado ou eliminado. settings.event_header_issue=Eventos da questão -settings.event_issues=Questões +settings.event_issues=Modificação settings.event_issues_desc=Questão aberta, fechada, reaberta ou editada. -settings.event_issue_assign=Questão atribuída +settings.event_issue_assign=Atribuição settings.event_issue_assign_desc=Encarregado atribuído ou retirado à questão. -settings.event_issue_label=Questão com rótulo -settings.event_issue_label_desc=Rótulos modificados ou retirados às questões. -settings.event_issue_milestone=Questão com etapa atribuída -settings.event_issue_milestone_desc=Etapa atribuída ou retirada à questão. -settings.event_issue_comment=Comentário da questão +settings.event_issue_label=Rótulos +settings.event_issue_label_desc=Rótulos adicionados ou retirados às questões. +settings.event_issue_milestone=Etapas +settings.event_issue_milestone_desc=Etapa atribuída, removida ou modificada. +settings.event_issue_comment=Comentários settings.event_issue_comment_desc=Comentário da questão criado, editado ou eliminado. settings.event_header_pull_request=Eventos de pedidos de integração -settings.event_pull_request=Pedido de integração +settings.event_pull_request=Modificação settings.event_pull_request_desc=Pedido de integração aberto, fechado, reaberto ou editado. -settings.event_pull_request_assign=Encarregado atribuído ao pedido de integração +settings.event_pull_request_assign=Atribuição settings.event_pull_request_assign_desc=Encarregado atribuído ou retirado ao pedido de integração. -settings.event_pull_request_label=Rótulo atribuído ao pedido de integração -settings.event_pull_request_label_desc=Rótulos modificados ou retirados aos pedidos de integração. -settings.event_pull_request_milestone=Etapa atribuída ao pedido de integração -settings.event_pull_request_milestone_desc=Etapa atribuída ou retirada ao pedido de integração. -settings.event_pull_request_comment=Comentário do pedido de integração +settings.event_pull_request_label=Rótulos +settings.event_pull_request_label_desc=Rótulos adicionados ou retirados aos pedidos de integração. +settings.event_pull_request_milestone=Etapas +settings.event_pull_request_milestone_desc=Etapas adicionadas, removidas ou modificadas. +settings.event_pull_request_comment=Comentários settings.event_pull_request_comment_desc=Comentário do pedido de integração criado, editado ou eliminado. -settings.event_pull_request_review=Pedido de integração revisto +settings.event_pull_request_review=Revisões settings.event_pull_request_review_desc=Pedido de integração aprovado, rejeitado ou comentado na revisão. -settings.event_pull_request_sync=Pedido de integração sincronizado -settings.event_pull_request_sync_desc=Pedido de integração sincronizado. -settings.event_pull_request_review_request=Solicitada a revisão do pedido de integração +settings.event_pull_request_sync=Sincronizado +settings.event_pull_request_sync_desc=Ramo sincronizado automaticamente com o ramo de destino. +settings.event_pull_request_review_request=Pedidos de revisão settings.event_pull_request_review_request_desc=A revisão do pedido de integração foi solicitada ou a solicitação de revisão foi removida. settings.event_pull_request_approvals=Aprovações do pedido de integração settings.event_pull_request_merge=Integração constante no pedido @@ -2612,7 +2614,7 @@ release.draft=Rascunho release.prerelease=Pré-lançamento release.stable=Estável release.compare=Comparar -release.edit=editar +release.edit=Editar release.ahead.commits=%d cometimentos release.ahead.target=para %s desde este lançamento tag.ahead.target=para o ramo %s desde esta etiqueta @@ -2734,7 +2736,7 @@ commits.search_branch = Este ramo pulls.title_desc_one = quer integrar %[1]d cometimento do ramo %[2]s no ramo %[3]s pulls.reopen_failed.base_branch = O pedido de integração não pode ser reaberto porque o ramo base já não existe. activity.navbar.code_frequency = Frequência de programação -settings.units.add_more = Adicionar mais... +settings.units.add_more = Habilitar mais settings.wiki_rename_branch_main_desc = Renomear o ramo usado internamente pelo Wiki para "%s". Esta operação é permanente e não poderá ser revertida. settings.add_collaborator_blocked_our = Não foi possível adicionar o/a colaborador/a porque o/a proprietário/a do repositório bloqueou-os. settings.add_webhook.invalid_path = A localização não pode conter "." ou ".." ou ficar em branco. Não pode começar ou terminar com uma barra. @@ -2757,7 +2759,7 @@ release.download_count_one = %s descarga release.download_count_few = %s descargas release.system_generated = Este anexo é gerado automaticamente. pulls.ready_for_review = Pronto/a para rever? -settings.units.units = Unidades do repositório +settings.units.units = Unidades error.broken_git_hook = Os automatismos git deste repositório parecem estar danificados. Consulte a documentação sobre como os consertar e depois envie alguns cometimentos para refrescar o estado. settings.rename_branch_failed_protected = Não é possível renomear o ramo %s porque é um ramo protegido. settings.units.overview = Visão geral @@ -2822,6 +2824,9 @@ settings.mirror_settings.push_mirror.none_ssh = Nenhuma settings.protect_new_rule = Criar uma nova regra de salvaguarda do ramo mirror_use_ssh.helper = O Forgejo irá replicar o repositório via Git sobre SSH e criar um par de chaves para si quando escolher esta opção. Tem que se certificar que a chave pública gerada está autorizada a enviar para o repositório de destino. Não pode usar a autorização baseada numa senha quando escolher isto. mirror_use_ssh.not_available = A autenticação por SSH não está disponível. +issues.new.assign_to_me = Atribuir a mim +issues.all_title = Todas +settings.discord_icon_url.exceeds_max_length = O URL do ícone tem que ter 2048 caracteres ou menos [graphs] component_loading=A carregar %s... @@ -3793,7 +3798,7 @@ management=Gerir segredos [actions] actions=Operações -unit.desc=Gerir sequências CI/CD integradas com Forgejo Actions +unit.desc=Gerir sequências CI/CD integradas com Forgejo Actions. status.unknown=Desconhecido status.waiting=Aguardando @@ -3938,7 +3943,7 @@ pull_kind = Procurar pedidos de integração... union = Palavras-chave union_tooltip = Incluir resultados correspondentes a qualquer das palavras-chave separadas por espaços em branco milestone_kind = Procurar etapas... -regexp_tooltip = Interpreta o termo de pesquisa como um expressão regular +regexp_tooltip = Interpreta o termo de pesquisa como uma expressão regular regexp = ExpReg [munits.data] diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 0bc633b008..2324567c45 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -477,6 +477,7 @@ back_to_sign_in = Назад ко входу sign_in_openid = Продолжить с OpenID hint_login = Уже есть учётная запись? Войдите! unauthorized_credentials = Учётные данные неверны или истекли. Попробуйте повторить команду или ознакомьтесь с подробностями по ссылке: %s +use_onetime_code = Использовать одноразовый код [mail] view_it_on=Посмотреть на %s @@ -1757,8 +1758,8 @@ issues.review.left_comment=оставил комментарий issues.review.content.empty=Запрашивая изменения, вы обязаны оставить комментарий с пояснением своих пожеланий относительно запроса на слияние. issues.review.reject=запрошены изменения %s issues.review.wait=был запрошен для отзыва %s -issues.review.add_review_request=запрошена рецензия у %s %s -issues.review.remove_review_request=отменён запрос рецензии для %s %s +issues.review.add_review_request=запрошена рецензия от %[1]s %[2]s +issues.review.remove_review_request=отменён запрос рецензии от %[1]s %[2]s issues.review.remove_review_request_self=отказ от рецензирования %s issues.review.pending=Ожидание issues.review.pending.tooltip=Этот комментарий в настоящее время не виден другим пользователям. Чтобы отправить отложенные комментарии, выберите «%s» → «%s/%s/%s» в верхней части страницы. @@ -2129,7 +2130,7 @@ settings.use_external_issue_tracker=Использовать внешнюю си settings.external_tracker_url=Ссылка на внешнюю систему задач settings.external_tracker_url_error=URL внешнего баг-трекера не является корректным URL. settings.external_tracker_url_desc=Посетители будут перенаправлены по указанному адресу трекера задач при открытии вкладки. -settings.tracker_url_format=Формат ссылки внешней системы задач +settings.tracker_url_format=Формат ссылок внешней системы задач settings.tracker_url_format_error=Формат URL внешнего баг-трекера некорректен. settings.tracker_issue_style=Формат нумерации во внешней системе задач settings.tracker_issue_style.numeric=Цифровой @@ -2830,6 +2831,12 @@ settings.mirror_settings.push_mirror.copy_public_key = Копировать пу issues.new.assign_to_me = Назначить себе issues.all_title = Все settings.discord_icon_url.exceeds_max_length = URL иконки не может быть длиннее 2048 символов +issues.review.add_review_requests = запрошены рецензии от %[1]s %[2]s +issues.review.remove_review_requests = отменены запросы рецензий от %[1]s %[2]s +issues.review.add_remove_review_requests = запрошены рецензии от %[1]s и отменены запросы рецензий от %[2]s %[3]s +pulls.delete_after_merge.head_branch.is_default = Головная ветвь, которую вы попытались удалить, является ветвью по умолчанию и не может быть удалена. +pulls.delete_after_merge.head_branch.is_protected = Головная ветвь, которую вы попытались удалить, защищена от этого и не может быть удалена. +pulls.delete_after_merge.head_branch.insufficient_branch = Отсутствует разрешение для удаления головной ветви. [graphs] diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index f4ad6754ef..492a43b63b 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -2456,7 +2456,7 @@ settings.ignore_stale_approvals_desc=对旧提交(过期审核)的批准将 settings.require_signed_commits=需要签名提交 settings.require_signed_commits_desc=拒绝推送未签名或无法验证的提交到分支 settings.protect_branch_name_pattern=受保护的分支名称正则 -settings.protect_branch_name_pattern_desc=分支保护的名称匹配规则。语法请参阅文档 。如:main, release/** +settings.protect_branch_name_pattern_desc=受保护的分支名称正则。语法请参阅文档 。如:main, release/** settings.protect_patterns=规则 settings.protect_protected_file_patterns=受保护的文件模式(使用半角分号“;”分隔) settings.protect_protected_file_patterns_desc=即使用户有权添加、编辑或删除此分支中的文件,也不允许直接更改受保护的文件。 可以使用半角分号(“;”)分隔多个模式。 见%s文档了解模式语法。例如: .drone.yml, /docs/**/*.txt。 @@ -2841,6 +2841,12 @@ mirror_use_ssh.not_available = SSH 验证不可用。 issues.new.assign_to_me = 指派给我 issues.all_title = 全部 settings.discord_icon_url.exceeds_max_length = 图标 URL 必须小于或等于 2048 个字符 +issues.review.remove_review_requests = 于 %[2]s 取消对 %[1]s 的评审请求 +issues.review.add_review_requests = 于 %[2]s 请求 %[1]s 评审 +issues.review.add_remove_review_requests = 于 %[3]s 请求 %[1]s 评审,并取消对 %[2]s 的评审请求 +pulls.delete_after_merge.head_branch.is_protected = 您要删除的头部分支是受保护的分支,无法删除。 +pulls.delete_after_merge.head_branch.insufficient_branch = 您没有权限删除头部分支。 +pulls.delete_after_merge.head_branch.is_default = 您要删除的头部分支是默认分支,无法删除。 [graphs] component_loading=正在加载 %s... From dfe3ffc581eb2fb2137aa9f1530d1296bc6a2801 Mon Sep 17 00:00:00 2001 From: Gusted Date: Wed, 30 Oct 2024 15:59:48 +0000 Subject: [PATCH 23/75] feat: harden localization against malicious HTML (#5703) - Add a new script that proccess the localization files and verify that they only contain HTML according to our strictly defined rules. - This should make adding malicious HTML near-impossible. Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/5703 Reviewed-by: 0ko <0ko@noreply.codeberg.org> Co-authored-by: Gusted Co-committed-by: Gusted --- Makefile | 6 +- build/lint-locale.go | 156 ++++++++++++++++++ build/lint-locale_test.go | 65 ++++++++ options/locale/locale_ar.ini | 6 +- options/locale/locale_bg.ini | 6 +- options/locale/locale_cs-CZ.ini | 10 +- options/locale/locale_de-DE.ini | 10 +- options/locale/locale_el-GR.ini | 10 +- options/locale/locale_en-US.ini | 10 +- options/locale/locale_eo.ini | 1 - options/locale/locale_es-ES.ini | 10 +- options/locale/locale_fa-IR.ini | 7 +- options/locale/locale_fi-FI.ini | 6 +- options/locale/locale_fil.ini | 10 +- options/locale/locale_fr-FR.ini | 12 +- options/locale/locale_gl.ini | 3 +- options/locale/locale_hu-HU.ini | 5 +- options/locale/locale_id-ID.ini | 5 +- options/locale/locale_is-IS.ini | 3 +- options/locale/locale_it-IT.ini | 11 +- options/locale/locale_ja-JP.ini | 11 +- options/locale/locale_ko-KR.ini | 5 +- options/locale/locale_lv-LV.ini | 9 +- options/locale/locale_nds.ini | 10 +- options/locale/locale_nl-NL.ini | 10 +- options/locale/locale_pl-PL.ini | 4 +- options/locale/locale_pt-BR.ini | 11 +- options/locale/locale_pt-PT.ini | 10 +- options/locale/locale_ru-RU.ini | 10 +- options/locale/locale_si-LK.ini | 21 ++- options/locale/locale_sk-SK.ini | 3 +- options/locale/locale_sl.ini | 2 +- options/locale/locale_sr-SP.ini | 2 +- options/locale/locale_sv-SE.ini | 4 +- options/locale/locale_tr-TR.ini | 9 +- options/locale/locale_uk-UA.ini | 6 +- options/locale/locale_zh-CN.ini | 10 +- options/locale/locale_zh-HK.ini | 2 +- options/locale/locale_zh-TW.ini | 11 +- templates/repo/editor/commit_form.tmpl | 2 +- .../repo/issue/view_content/comments.tmpl | 2 +- templates/repo/issue/view_title.tmpl | 4 +- templates/user/settings/applications.tmpl | 2 +- 43 files changed, 361 insertions(+), 151 deletions(-) create mode 100644 build/lint-locale.go create mode 100644 build/lint-locale_test.go diff --git a/Makefile b/Makefile index 62cf4e536d..f9c02cfbf3 100644 --- a/Makefile +++ b/Makefile @@ -418,7 +418,7 @@ lint-frontend: lint-js lint-css lint-frontend-fix: lint-js-fix lint-css-fix .PHONY: lint-backend -lint-backend: lint-go lint-go-vet lint-editorconfig lint-renovate +lint-backend: lint-go lint-go-vet lint-editorconfig lint-renovate lint-locale .PHONY: lint-backend-fix lint-backend-fix: lint-go-fix lint-go-vet lint-editorconfig @@ -461,6 +461,10 @@ lint-renovate: node_modules @if grep --quiet --extended-regexp -e '^( WARN:|ERROR:)' .lint-renovate ; then cat .lint-renovate ; rm .lint-renovate ; exit 1 ; fi @rm .lint-renovate +.PHONY: lint-locale +lint-locale: + $(GO) run build/lint-locale.go + .PHONY: lint-md lint-md: node_modules npx markdownlint docs *.md diff --git a/build/lint-locale.go b/build/lint-locale.go new file mode 100644 index 0000000000..d403eaa70d --- /dev/null +++ b/build/lint-locale.go @@ -0,0 +1,156 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +//nolint:forbidigo +package main + +import ( + "fmt" + "html" + "io/fs" + "os" + "path/filepath" + "regexp" + "slices" + "strings" + + "github.com/microcosm-cc/bluemonday" + "github.com/sergi/go-diff/diffmatchpatch" + "gopkg.in/ini.v1" //nolint:depguard +) + +var ( + policy *bluemonday.Policy + tagRemover *strings.Replacer + safeURL = "https://TO-BE-REPLACED.COM" + + // Matches href="", href="#", href="%s", href="#%s", href="%[1]s" and href="#%[1]s". + placeHolderRegex = regexp.MustCompile(`href="#?(%s|%\[\d\]s)?"`) +) + +func initBlueMondayPolicy() { + policy = bluemonday.NewPolicy() + + policy.RequireParseableURLs(true) + policy.AllowURLSchemes("https") + + // Only allow safe URL on href. + // Only allow target="_blank". + // Only allow rel="nopener noreferrer", rel="noopener" and rel="noreferrer". + // Only allow placeholder on id and class. + policy.AllowAttrs("href").Matching(regexp.MustCompile("^" + regexp.QuoteMeta(safeURL) + "$")).OnElements("a") + policy.AllowAttrs("target").Matching(regexp.MustCompile("^_blank$")).OnElements("a") + policy.AllowAttrs("rel").Matching(regexp.MustCompile("^(noopener|noreferrer|noopener noreferrer)$")).OnElements("a") + policy.AllowAttrs("id", "class").Matching(regexp.MustCompile(`^%s|%\[\d\]s$`)).OnElements("a") + + // Only allow positional placeholder as class. + positionalPlaceholderRe := regexp.MustCompile(`^%\[\d\]s$`) + policy.AllowAttrs("class").Matching(positionalPlaceholderRe).OnElements("strong") + policy.AllowAttrs("id").Matching(positionalPlaceholderRe).OnElements("code") + + // Allowed elements with no attributes. Must be a recognized tagname. + policy.AllowElements("strong", "br", "b", "strike", "code", "i") + + // TODO: Remove in `actions.workflow.dispatch.trigger_found`. + policy.AllowNoAttrs().OnElements("c") +} + +func initRemoveTags() { + oldnew := []string{} + for _, el := range []string{ + "email@example.com", "correu@example.com", "epasts@domens.lv", "email@exemplo.com", "eposta@ornek.com", "email@példa.hu", "email@esempio.it", + "user", "utente", "lietotājs", "gebruiker", "usuário", "Benutzer", "Bruker", + "server", "servidor", "kiszolgáló", "serveris", + "label", "etichetta", "etiķete", "rótulo", "Label", "utilizador", + "filename", "bestandsnaam", "dosyaadi", "fails", "nome do arquivo", + } { + oldnew = append(oldnew, "<"+el+">", "REPLACED-TAG") + } + + tagRemover = strings.NewReplacer(oldnew...) +} + +func preprocessTranslationValue(value string) string { + // href should be a parsable URL, replace placeholder strings with a safe url. + value = placeHolderRegex.ReplaceAllString(value, `href="`+safeURL+`"`) + + // Remove tags that aren't tags but will be parsed as tags. We already know they are safe and sound. + value = tagRemover.Replace(value) + + return value +} + +func checkLocaleContent(localeContent []byte) []string { + // Same configuration as Forgejo uses. + cfg := ini.Empty(ini.LoadOptions{ + IgnoreContinuation: true, + }) + cfg.NameMapper = ini.SnackCase + + if err := cfg.Append(localeContent); err != nil { + panic(err) + } + + dmp := diffmatchpatch.New() + errors := []string{} + + for _, section := range cfg.Sections() { + for _, key := range section.Keys() { + var trKey string + if section.Name() == "" || section.Name() == "DEFAULT" || section.Name() == "common" { + trKey = key.Name() + } else { + trKey = section.Name() + "." + key.Name() + } + + keyValue := preprocessTranslationValue(key.Value()) + + if html.UnescapeString(policy.Sanitize(keyValue)) != keyValue { + // Create a nice diff of the difference. + diffs := dmp.DiffMain(keyValue, html.UnescapeString(policy.Sanitize(keyValue)), false) + diffs = dmp.DiffCleanupSemantic(diffs) + diffs = dmp.DiffCleanupEfficiency(diffs) + + errors = append(errors, trKey+": "+dmp.DiffPrettyText(diffs)) + } + } + } + return errors +} + +func main() { + initBlueMondayPolicy() + initRemoveTags() + + localeDir := filepath.Join("options", "locale") + localeFiles, err := os.ReadDir(localeDir) + if err != nil { + panic(err) + } + + if !slices.ContainsFunc(localeFiles, func(e fs.DirEntry) bool { return strings.HasSuffix(e.Name(), ".ini") }) { + fmt.Println("No locale files found") + os.Exit(1) + } + + exitCode := 0 + for _, localeFile := range localeFiles { + if !strings.HasSuffix(localeFile.Name(), ".ini") { + continue + } + + localeContent, err := os.ReadFile(filepath.Join(localeDir, localeFile.Name())) + if err != nil { + panic(err) + } + + if err := checkLocaleContent(localeContent); len(err) > 0 { + fmt.Println(localeFile.Name()) + fmt.Println(strings.Join(err, "\n")) + fmt.Println() + exitCode = 1 + } + } + + os.Exit(exitCode) +} diff --git a/build/lint-locale_test.go b/build/lint-locale_test.go new file mode 100644 index 0000000000..b33dc9af2b --- /dev/null +++ b/build/lint-locale_test.go @@ -0,0 +1,65 @@ +// Copyright 2024 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT +package main + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestLocalizationPolicy(t *testing.T) { + initBlueMondayPolicy() + initRemoveTags() + + t.Run("Remove tags", func(t *testing.T) { + assert.Empty(t, checkLocaleContent([]byte(`hidden_comment_types_description = Comment types checked here will not be shown inside issue pages. Checking "Label" for example removes all " added/removed "}, checkLocaleContent([]byte(`key = %[1]s`))) + }) + + t.Run("General safe tags", func(t *testing.T) { + assert.Empty(t, checkLocaleContent([]byte("error404 = The page you are trying to reach either does not exist or you are not authorized to view it."))) + assert.Empty(t, checkLocaleContent([]byte("teams.specific_repositories_helper = Members will only have access to repositories explicitly added to the team. Selecting this will not automatically remove repositories already added with All repositories."))) + assert.Empty(t, checkLocaleContent([]byte("sqlite_helper = File path for the SQLite3 database.
Enter an absolute path if you run Forgejo as a service."))) + assert.Empty(t, checkLocaleContent([]byte("hi_user_x = Hi %s,"))) + + assert.EqualValues(t, []string{"error404: The page you are trying to reach either does not exist or you are not authorized to view it."}, checkLocaleContent([]byte("error404 = The page you are trying to reach either does not exist or you are not authorized to view it."))) + }) + + t.Run("
", func(t *testing.T) { + assert.Empty(t, checkLocaleContent([]byte(`admin.new_user.text = Please click here to manage this user from the admin panel.`))) + assert.Empty(t, checkLocaleContent([]byte(`access_token_desc = Selected token permissions limit authorization only to the corresponding API routes. Read the documentation for more information.`))) + assert.Empty(t, checkLocaleContent([]byte(`webauthn_desc = Security keys are hardware devices containing cryptographic keys. They can be used for two-factor authentication. Security keys must support the WebAuthn Authenticator standard.`))) + assert.Empty(t, checkLocaleContent([]byte("issues.closed_at = `closed this issue %[2]s`"))) + + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: "}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: "}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + assert.EqualValues(t, []string{"key: \x1b[31m\x1b[0m"}, checkLocaleContent([]byte(`key = `))) + }) + + t.Run("Escaped HTML characters", func(t *testing.T) { + assert.Empty(t, checkLocaleContent([]byte("activity.git_stats_push_to_branch = `إلى %s و\"`"))) + + assert.EqualValues(t, []string{"key: و\x1b[31m \x1b[0m\x1b[32m\u00a0\x1b[0m"}, checkLocaleContent([]byte(`key = و `))) + }) +} diff --git a/options/locale/locale_ar.ini b/options/locale/locale_ar.ini index 76fe2a3fdd..f92cec14c2 100644 --- a/options/locale/locale_ar.ini +++ b/options/locale/locale_ar.ini @@ -960,7 +960,7 @@ settings.recent_deliveries = التوصيل الأخيرة projects.new = مشروع جديد file_history = تاريخ editor.directory_is_a_file = اسم المجلد "%s" مستخدم فعلا لاسم ملف في هذا المستودع. -editor.commit_directly_to_this_branch = أودع مباشرةً إلى فرع %s. +editor.commit_directly_to_this_branch = أودع مباشرةً إلى فرع %[1]s. editor.unable_to_upload_files = تعذر رفع الملفات إلى "%s" برسالة الخطأ: %v settings.webhook.payload = المحتوى invisible_runes_header = `يحتوي هذا الملف على محارف يونيكود غير مرئية` @@ -1105,7 +1105,7 @@ activity.git_stats_pushed_1 = دفع activity.git_stats_pushed_n = دفعوا activity.git_stats_commit_1 = %d إيداع activity.git_stats_commit_n = %d إيداعا -activity.git_stats_push_to_branch = إلى %s و  +activity.git_stats_push_to_branch = `إلى %s و"` activity.git_stats_push_to_all_branches = إلى كل الفروع. activity.git_stats_on_default_branch = في %s، activity.git_stats_file_1 = %d ملف @@ -1115,7 +1115,7 @@ activity.git_stats_files_changed_n = تغيّروا activity.git_stats_additions = وحدثت activity.git_stats_addition_1 = %d إضافة activity.git_stats_addition_n = %d إضافة -activity.git_stats_and_deletions = و  +activity.git_stats_and_deletions = `و"` activity.git_stats_deletion_1 = %d إزالة activity.git_stats_deletion_n = %d إزالة settings.mirror_settings.direction = الاتجاه diff --git a/options/locale/locale_bg.ini b/options/locale/locale_bg.ini index ca11b20ff2..1387bdd0e2 100644 --- a/options/locale/locale_bg.ini +++ b/options/locale/locale_bg.ini @@ -846,7 +846,7 @@ editor.propose_file_change = Предлагане на промяна на фа editor.create_new_branch = Създаване на нов клон за това подаване и започване на заявка за сливане. editor.create_new_branch_np = Създаване на нов клон за това подаване. editor.filename_is_invalid = Името на файла е невалидно: „%s“. -editor.commit_directly_to_this_branch = Подаване директно към клона %s. +editor.commit_directly_to_this_branch = Подаване директно към клона %[1]s. editor.branch_already_exists = Клонът „%s“ вече съществува в това хранилище. editor.file_already_exists = Файл с име „%s“ вече съществува в това хранилище. editor.commit_empty_file_header = Подаване на празен файл @@ -997,7 +997,7 @@ pulls.cmd_instruction_hint = Вижте инструкциите за коман pulls.showing_only_single_commit = Показани са само промените в подаване %[1]s issues.lock_no_reason = заключи и ограничи обсъждането до сътрудници %s pulls.expand_files = Разгъване на всички файлове -pulls.title_desc_few = иска да слее %[1]d подавания от %[2]s в %[3]s +pulls.title_desc_few = иска да слее %[1]d подавания от %[2]s в %[3]s issues.content_history.deleted = изтрито activity.git_stats_exclude_merges = С изключение на сливанията, activity.navbar.pulse = Последна дейност @@ -1017,7 +1017,7 @@ pulls.collapse_files = Свиване на всички файлове pulls.show_all_commits = Показване на всички подавания diff.whitespace_button = Празни знаци issues.content_history.edited = редактирано -pulls.title_desc_one = иска да слее %[1]d подаване от %[2]s в %[3]s +pulls.title_desc_one = иска да слее %[1]d подаване от %[2]s в %[3]s pulls.showing_specified_commit_range = Показани са само промените между %[1]s..%[2]s pulls.merged_title_desc_one = сля %[1]d подаване от %[2]s в %[3]s %[4]s pulls.no_merge_access = Не сте упълномощени за сливане на тази заявка за сливане. diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 829df0124f..a400aed94b 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -1036,7 +1036,7 @@ blocked_users = Zablokovaní uživatelé change_password = Změnit heslo user_block_success = Uživatel byl úspěšně zablokován. user_unblock_success = Uživatel byl úspěšně odblokován. -access_token_desc = Oprávnění vybraného tokenu omezují autorizaci pouze na příslušné cesty API. Pro více informací si přečtěte dokumentaci. +access_token_desc = Oprávnění vybraného tokenu omezují autorizaci pouze na příslušné cesty API. Pro více informací si přečtěte dokumentaci. blocked_users_none = Nemáte žádné zablokované uživatele. blocked_since = Zablokován od %s hints = Nápovědy @@ -1360,7 +1360,7 @@ editor.fail_to_apply_patch=Nelze použít záplatu „%s“ editor.new_patch=Nová záplata editor.commit_message_desc=Přidat volitelný rozšířený popis… editor.signoff_desc=Přidat Signed-off-by podpis přispěvatele na konec zprávy o commitu. -editor.commit_directly_to_this_branch=Odeslat přímo do větve %s. +editor.commit_directly_to_this_branch=Odeslat přímo do větve %[1]s. editor.create_new_branch=Vytvořit novou větev pro tento commit a vytvořit žádost o sloučení. editor.create_new_branch_np=Vytvořte novou větev z tohoto commitu. editor.propose_file_change=Navrhnout změnu souboru @@ -1725,7 +1725,7 @@ issues.error_modifying_due_date=Změna termínu dokončení selhala. issues.error_removing_due_date=Odstranění termínu dokončení selhalo. issues.push_commit_1=přidal/a %d commit %s issues.push_commits_n=přidal/a %d commity %s -issues.force_push_codes=`vynucené nahrání %[1]s od %[2]s do %[4]s %[6]s` +issues.force_push_codes=`vynucené nahrání %[1]s od %[2]s do %[4]s %[6]s` issues.force_push_compare=Porovnat issues.due_date_form=rrrr-mm-dd issues.due_date_form_add=Přidat termín dokončení @@ -1841,7 +1841,7 @@ pulls.nothing_to_compare_have_tag=Vybraná větev/značka je stejná. pulls.nothing_to_compare_and_allow_empty_pr=Tyto větve jsou stejné. Tato žádost o sloučení bude prázdná. pulls.has_pull_request=`Žádost o sloučení mezi těmito větvemi již existuje: %[2]s#%[3]d` pulls.create=Vytvořit žádost o sloučení -pulls.title_desc_few=chce sloučit %[1]d commity z větve %[2]s do %[3]s +pulls.title_desc_few=chce sloučit %[1]d commity z větve %[2]s do %[3]s pulls.merged_title_desc_few=sloučil %[1]d commity z větve %[2]s do větve %[3]s před %[4]s pulls.change_target_branch_at=`změnil/a cílovou větev z %s na %s %s` pulls.tab_conversation=Konverzace @@ -2765,7 +2765,7 @@ settings.protect_enable_merge_desc = Kdokoli s přístupem k zápisu bude moci s settings.archive.text = Archivováním repozitáře jej celý převedete do stavu pouze pro čtení. Bude skryt z nástěnky. Nikdo (ani vy!) nebude moci vytvářet nové commity ani otevírat problémy a žádosti o sloučení. settings.event_pull_request_review_request_desc = Bylo požádáno o posouzení žádosti o sloučení nebo bylo toto požádání odstraněno. error.broken_git_hook = Zdá se, že u tohoto repozitáře jsou rozbité Git hooks. Pro jejich opravení se prosím řiďte pokyny v dokumentaci a poté odešlete několik commitů pro obnovení stavu. -pulls.title_desc_one = žádá o sloučení %[1]d commitu z %[2]s do %[3]s +pulls.title_desc_one = žádá o sloučení %[1]d commitu z %[2]s do %[3]s pulls.merged_title_desc_one = sloučil %[1]d commit z %[2]s do %[3]s %[4]s open_with_editor = Otevřít pomocí %s commits.search_branch = Tato větev diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 997dd8c2a0..b96d185142 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -936,7 +936,7 @@ select_permissions=Berechtigungen auswählen permission_no_access=Kein Zugriff permission_read=Lesen permission_write=Lesen und Schreiben -access_token_desc=Ausgewählte Token-Berechtigungen beschränken die Authentifizierung auf die entsprechenden API-Routen. Lies die Dokumentation für mehr Informationen. +access_token_desc=Ausgewählte Token-Berechtigungen beschränken die Authentifizierung auf die entsprechenden API-Routen. Lies die Dokumentation für mehr Informationen. at_least_one_permission=Du musst mindestens eine Berechtigung auswählen, um ein Token zu erstellen permissions_list=Berechtigungen: @@ -1353,7 +1353,7 @@ editor.fail_to_apply_patch=Patch „%s“ nicht anwendbar editor.new_patch=Neuer Patch editor.commit_message_desc=Eine ausführlichere (optionale) Beschreibung hinzufügen … editor.signoff_desc=Am Ende der Commit-Nachricht einen „Signed-off-by“-Anhang vom Committer hinzufügen. -editor.commit_directly_to_this_branch=Direkt in den Branch „%s“ einchecken. +editor.commit_directly_to_this_branch=Direkt in den Branch „%[1]s“ einchecken. editor.create_new_branch=Einen neuen Branch für diesen Commit erstellen und einen Pull-Request starten. editor.create_new_branch_np=Erstelle einen neuen Branch für diesen Commit. editor.propose_file_change=Dateiänderung vorschlagen @@ -1719,7 +1719,7 @@ issues.error_modifying_due_date=Fehler beim Ändern des Fälligkeitsdatums. issues.error_removing_due_date=Fehler beim Entfernen des Fälligkeitsdatums. issues.push_commit_1=hat %d Commit %s hinzugefügt issues.push_commits_n=hat %d Commits %s hinzugefügt -issues.force_push_codes=`hat %[6]s %[1]s von %[2]s zu %[4]s force-gepusht` +issues.force_push_codes=`hat %[6]s %[1]s von %[2]s zu %[4]s force-gepusht` issues.force_push_compare=Vergleichen issues.due_date_form=JJJJ-MM-TT issues.due_date_form_add=Fälligkeitsdatum hinzufügen @@ -1834,7 +1834,7 @@ pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Reques pulls.nothing_to_compare_and_allow_empty_pr=Diese Branches sind gleich. Der Pull-Request wird leer sein. pulls.has_pull_request=`Es existiert bereits ein Pull-Request zwischen diesen beiden Branches: %[2]s#%[3]d` pulls.create=Pull-Request erstellen -pulls.title_desc_few=möchte %[1]d Commits von %[2]s nach %[3]s zusammenführen +pulls.title_desc_few=möchte %[1]d Commits von %[2]s nach %[3]s zusammenführen pulls.merged_title_desc_few=hat %[1]d Commits von %[2]s nach %[3]s %[4]s zusammengeführt pulls.change_target_branch_at=`hat den Zielbranch von %s nach %s %s geändert` pulls.tab_conversation=Diskussion @@ -2751,7 +2751,7 @@ activity.navbar.code_frequency = Code-Frequenz file_follow = Symlink folgen error.broken_git_hook = Die Git-Hooks des Repositorys scheinen kaputt zu sein. Bitte folge der Dokumentation um sie zu reparieren, dann pushe einige Commits um den Status zu aktualisieren. pulls.merged_title_desc_one = hat %[1]d Commit von %[2]s nach %[3]s %[4]s zusammengeführt -pulls.title_desc_one = möchte %[1]d Commit von %[2]s nach %[3]s zusammenführen +pulls.title_desc_one = möchte %[1]d Commit von %[2]s nach %[3]s zusammenführen open_with_editor = Öffnen mit %s commits.search_branch = Dieser Branch pulls.ready_for_review = Bereit zum Review? diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini index 05af282d5a..d6b617bcd2 100644 --- a/options/locale/locale_el-GR.ini +++ b/options/locale/locale_el-GR.ini @@ -932,7 +932,7 @@ select_permissions=Επιλογή δικαιωμάτων permission_no_access=Καμία πρόσβαση permission_read=Αναγνωσμένες permission_write=Ανάγνωση και εγγραφή -access_token_desc=Τα επιλεγμένα δικαιώματα διακριτικών περιορίζουν την άδεια μόνο στις αντίστοιχες διαδρομές API. Διαβάστε το εγχειρίδιο για περισσότερες πληροφορίες. +access_token_desc=Τα επιλεγμένα δικαιώματα διακριτικών περιορίζουν την άδεια μόνο στις αντίστοιχες διαδρομές API. Διαβάστε το εγχειρίδιο για περισσότερες πληροφορίες. at_least_one_permission=Πρέπει να επιλέξετε τουλάχιστον ένα δικαίωμα για να δημιουργήσετε ένα διακριτικό permissions_list=Δικαιώματα: @@ -1350,7 +1350,7 @@ editor.fail_to_apply_patch=`Αδυναμία εφαρμογής της επιδ editor.new_patch=Νέο patch editor.commit_message_desc=Προσθήκη προαιρετικής εκτενούς περιγραφής… editor.signoff_desc=Προσθέστε ένα πρόσθετο Signed-off-by στο τέλος του μηνύματος καταγραφής της υποβολής. -editor.commit_directly_to_this_branch=Υποβολή απευθείας στο κλάδο %s. +editor.commit_directly_to_this_branch=Υποβολή απευθείας στο κλάδο %[1]s. editor.create_new_branch=Δημιουργήστε έναν νέο κλάδο για αυτή την υποβολή και ξεκινήστε ένα pull request. editor.create_new_branch_np=Δημιουργήστε έναν νέο κλάδο για αυτή την υποβολή. editor.propose_file_change=Πρόταση αλλαγής αρχείου @@ -1716,7 +1716,7 @@ issues.error_modifying_due_date=Προέκυψε σφάλμα κατά την α issues.error_removing_due_date=Προέκυψε σφάλμα κατά την κατάργηση ημερομηνίας παράδοσης. issues.push_commit_1=πρόσθεσε %d υποβολή %s issues.push_commits_n=πρόσθεσε %d υποβολές %s -issues.force_push_codes=`έκανε force-push %[1]s από το %[2]s στο %[4]s %[6]s` +issues.force_push_codes=`έκανε force-push %[1]s από το %[2]s στο %[4]s %[6]s` issues.force_push_compare=Σύγκριση issues.due_date_form=εεεε-μμ-ηη issues.due_date_form_add=Προσθήκη ημερομηνίας παράδοσης @@ -1831,7 +1831,7 @@ pulls.nothing_to_compare=Αυτοί οι κλάδοι είναι ίδιοι. Δ pulls.nothing_to_compare_and_allow_empty_pr=Αυτοί οι κλάδοι είναι ίδιοι. Αυτό το PR θα είναι κενό. pulls.has_pull_request=`Υπάρχει ήδη pull request μεταξύ αυτών των κλάδων: %[2]s#%[3]d` pulls.create=Δημιουργία pull request -pulls.title_desc_few=θέλει να συγχωνεύσει %[1]d υποβολές από %[2]s σε %[3]s +pulls.title_desc_few=θέλει να συγχωνεύσει %[1]d υποβολές από %[2]s σε %[3]s pulls.merged_title_desc_few=συγχώνευσε %[1]d υποβολές από %[2]s σε %[3]s %[4]s pulls.change_target_branch_at=`άλλαξε τον κλάδο προορισμού από %s σε %s %s` pulls.tab_conversation=Συζήτηση @@ -2744,7 +2744,7 @@ n_commit_one = %s υποβολή stars = Αστέρια n_branch_one = %s κλάδος commits.search_branch = Αυτός ο κλάδος -pulls.title_desc_one = : θα ήθελε να συγχωνεύσει %[1]d υποβολή από τον κλάδο %[2]s στον κλάδο %[3]s +pulls.title_desc_one = : θα ήθελε να συγχωνεύσει %[1]d υποβολή από τον κλάδο %[2]s στον κλάδο %[3]s pulls.merged_title_desc_one = συγχώνευσε %[1]d υποβολή από τον κλάδο %[2]s στον κλάδο %[3]s %[4]s n_commit_few = %s υποβολές settings.sourcehut_builds.secrets = Μυστικά diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 289b8aa17f..0700ee1624 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -935,7 +935,7 @@ select_permissions = Select permissions permission_no_access = No access permission_read = Read permission_write = Read and write -access_token_desc = Selected token permissions limit authorization only to the corresponding API routes. Read the documentation for more information. +access_token_desc = Selected token permissions limit authorization only to the corresponding API routes. Read the documentation for more information. at_least_one_permission = You must select at least one permission to create a token permissions_list = Permissions: @@ -1372,7 +1372,7 @@ editor.fail_to_apply_patch = Unable to apply patch "%s" editor.new_patch = New patch editor.commit_message_desc = Add an optional extended description… editor.signoff_desc = Add a Signed-off-by trailer by the committer at the end of the commit log message. -editor.commit_directly_to_this_branch = Commit directly to the %s branch. +editor.commit_directly_to_this_branch = Commit directly to the %[1]s branch. editor.create_new_branch = Create a new branch for this commit and start a pull request. editor.create_new_branch_np = Create a new branch for this commit. editor.propose_file_change = Propose file change @@ -1740,7 +1740,7 @@ issues.time_spent_from_all_authors = `Total time spent: %s` issues.due_date = Due date issues.push_commit_1 = added %d commit %s issues.push_commits_n = added %d commits %s -issues.force_push_codes = `force-pushed %[1]s from %[2]s to %[4]s %[6]s` +issues.force_push_codes = `force-pushed %[1]s from %[2]s to %[4]s %[6]s` issues.force_push_compare = Compare issues.due_date_form = yyyy-mm-dd issues.due_date_form_edit = Edit @@ -1859,8 +1859,8 @@ pulls.nothing_to_compare_have_tag = The selected branch/tag are equal. pulls.nothing_to_compare_and_allow_empty_pr = These branches are equal. This PR will be empty. pulls.has_pull_request = `A pull request between these branches already exists: %[2]s#%[3]d` pulls.create = Create pull request -pulls.title_desc_one = wants to merge %[1]d commit from %[2]s into %[3]s -pulls.title_desc_few = wants to merge %[1]d commits from %[2]s into %[3]s +pulls.title_desc_one = wants to merge %[1]d commit from %[2]s into %[3]s +pulls.title_desc_few = wants to merge %[1]d commits from %[2]s into %[3]s pulls.merged_title_desc_one = merged %[1]d commit from %[2]s into %[3]s %[4]s pulls.merged_title_desc_few = merged %[1]d commits from %[2]s into %[3]s %[4]s pulls.change_target_branch_at = `changed target branch from %s to %s %s` diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini index 1c36206eb1..64b1908b46 100644 --- a/options/locale/locale_eo.ini +++ b/options/locale/locale_eo.ini @@ -202,7 +202,6 @@ app_desc = Senpena kaj memgastigebla Git-servo install = Facile instalebla lightweight = Malpeza license = Libera fontkodo -platform_desc = Forgejo ruleblas ĉie ajn Go bittradukeblas: Windows, macOS, Linux, ARM, etc. Elektu laŭplaĉe! install_desc = Simple aŭ prenu la ruldosieron por via operaciumo, aŭ instalu enuje per Docker, aŭ instalu pakaĵe. lightweight_desc = Forgejo ne penigos vian servilon, kaj eĉ ruleblas je Raspberry Pi. Konservu vian komputpotencon! platform = Plursistema diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 0c06cdcece..1a6ac696d3 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -932,7 +932,7 @@ select_permissions=Seleccionar permisos permission_no_access=Sin acceso permission_read=Leídas permission_write=Lectura y escritura -access_token_desc=Los permisos de los tokens seleccionados limitan la autorización sólo a las rutas API correspondientes. Lea la documentación para más información. +access_token_desc=Los permisos de los tokens seleccionados limitan la autorización sólo a las rutas >API correspondientes. Lea la >documentación para más información. at_least_one_permission=Debe seleccionar al menos un permiso para crear un token permissions_list=Permisos: @@ -1349,7 +1349,7 @@ editor.fail_to_apply_patch=`No se puede aplicar el parche "%s"` editor.new_patch=Nuevo parche editor.commit_message_desc=Añadir una descripción extendida opcional… editor.signoff_desc=Añadir un trailer firmado por el committer al final del mensaje de registro de confirmación. -editor.commit_directly_to_this_branch=Hacer commit directamente en la rama %s. +editor.commit_directly_to_this_branch=Hacer commit directamente en la rama %[1]s. editor.create_new_branch=Crear una nueva rama para este commit y hacer un pull request. editor.create_new_branch_np=Crear una nueva rama para este commit. editor.propose_file_change=Proponer cambio de archivo @@ -1715,7 +1715,7 @@ issues.error_modifying_due_date=Fallo al modificar la fecha de vencimiento. issues.error_removing_due_date=Fallo al eliminar la fecha de vencimiento. issues.push_commit_1=añadió %d commit %s issues.push_commits_n=añadió %d commits %s -issues.force_push_codes=`hizo push forzado %[1]s de %[2]s a %[4]s %[6]s` +issues.force_push_codes=`hizo push forzado %[1]s de %[2]s a %[4]s %[6]s` issues.force_push_compare=Comparar issues.due_date_form=aaaa-mm-dd issues.due_date_form_add=Añadir fecha de vencimiento @@ -1830,7 +1830,7 @@ pulls.nothing_to_compare=Estas ramas son iguales. No hay necesidad para crear un pulls.nothing_to_compare_and_allow_empty_pr=Estas ramas son iguales. Este PR estará vacío. pulls.has_pull_request=`Ya existe un pull request entre estas ramas: %[2]s#%[3]d` pulls.create=Crear pull request -pulls.title_desc_few=quiere fusionar %[1]d commits de %[2]s en %[3]s +pulls.title_desc_few=quiere fusionar %[1]d commits de %[2]s en %[3]s pulls.merged_title_desc_few=fusionó %[1]d commits de %[2]s en %[3]s %[4]s pulls.change_target_branch_at=`cambió la rama objetivo de %s a %s %s` pulls.tab_conversation=Conversación @@ -2735,7 +2735,7 @@ pulls.blocked_by_user = No puedes crear una pull request en este repositorio por issues.comment.blocked_by_user = No puedes crear un comentario en esta incidencia porque estás bloqueado por el propietario del repositorio o el autor de la incidencia. comments.edit.already_changed = No fue posible guardar los cambios al comentario. Parece que el contenido ya fue modificado por otro usuario. Actualiza la página e intenta editar de nuevo para evitar sobrescribir los cambios pulls.edit.already_changed = No fue posible guardar los cambios al pull request. Parece que el contenido ya fue modificado por otro usuario. Actualiza la página e intenta editar de nuevo para evitar sobrescribir los cambios -pulls.title_desc_one = quiere fusionar %[1]d commit de %[2]s en %[3]s +pulls.title_desc_one = quiere fusionar %[1]d commit de %[2]s en %[3]s pulls.ready_for_review = Listo para revisar? activity.navbar.contributors = Contribuidores pulls.cmd_instruction_hint = Ver instrucciones para la línea de comandos diff --git a/options/locale/locale_fa-IR.ini b/options/locale/locale_fa-IR.ini index a9e150a7cb..297785a0c8 100644 --- a/options/locale/locale_fa-IR.ini +++ b/options/locale/locale_fa-IR.ini @@ -149,7 +149,6 @@ missing_csrf=درخواست بد: بلیط CSRF ندارد app_desc=یک سرویس گیت بی‌درد سر و راحت install=راه‌اندازی ساده platform=مستقل از سکو -platform_desc=گیت همه جا اجرا می‌شود بریم! می‌توانید Windows, macOS, Linux, ARM و ... هر کدام را دوست داشتید انتخاب کنید! lightweight=ابزارک سبک lightweight_desc=گیتی با حداقل منابع میتوانید برای روی دستگاه Raspberry Pi اجرا شود و مصرف انرژی شما را کاهش دهد! license=متن باز @@ -985,7 +984,7 @@ editor.commit_changes=تغییرات کامیت editor.add_tmpl=افزودن '' editor.commit_message_desc=توضیحی تخصصی به دلخواه اضافه نمایید… editor.signoff_desc=یک تریلر Signed-off-by توسط committer در انتهای پیام گزارش commit اضافه کنید. -editor.commit_directly_to_this_branch=ثبت کامیت به صورت مستقیم در انشعاب %s. +editor.commit_directly_to_this_branch=ثبت کامیت به صورت مستقیم در انشعاب %[1]s. editor.create_new_branch=یک شاخه جدید برای این commit ایجاد کنید و تقاضای واکشی را شروع کنید. editor.create_new_branch_np=یک شاخه جدید برای کامیت بسازید. editor.propose_file_change=پیشنهاد تغییر پرونده @@ -1254,7 +1253,7 @@ issues.error_modifying_due_date=تغییر موعد مقرر با شکست مو issues.error_removing_due_date=حذف موعد مقرر با شکست مواجه شد. issues.push_commit_1=%d اعمال تغییر اضافه شده است %s issues.push_commits_n=%d اعمال تغییرات اضافه شده است %s -issues.force_push_codes=`پوش شده اجباری %[1]s از %[2]s به %[4]s %[6]s` +issues.force_push_codes=`پوش شده اجباری %[1]s از %[2]s به %[4]s %[6]s` issues.force_push_compare=مقایسه issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=افزودن موعد مقرر @@ -1340,7 +1339,7 @@ pulls.nothing_to_compare=این شاخه‎ها یکی هستند. نیازی ب pulls.nothing_to_compare_and_allow_empty_pr=این شاخه ها برابر هستند. این PR خالی خواهد بود. pulls.has_pull_request=`A درخواست pull بین این شاخه ها از قبل وجود دارد: %[2]s#%[3]d` pulls.create=ایجاد تقاضای واکشی -pulls.title_desc_few=قصد ادغام %[1]d تغییر را از %[2]s به %[3]s دارد +pulls.title_desc_few=قصد ادغام %[1]d تغییر را از %[2]s به %[3]s دارد pulls.merged_title_desc_few=%[1]d کامیت ادغام شده از %[2]s به %[3]s %[4]s pulls.change_target_branch_at=`هدف شاخه از %s به %s %s تغییر کرد` pulls.tab_conversation=گفتگو diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 2ccbbf0978..bae6c8e59d 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -928,7 +928,7 @@ editor.cancel_lower=Peru editor.commit_signed_changes=Commitoi vahvistetut muutokset editor.commit_changes=Kommitoi muutokset editor.add_tmpl=Lisää "" -editor.commit_directly_to_this_branch=Commitoi suoraan %s haaraan. +editor.commit_directly_to_this_branch=Commitoi suoraan %[1]s haaraan. editor.create_new_branch=Luo uusi haara tälle commitille ja aloita vetopyyntö. editor.create_new_branch_np=Luo uusi haara tälle commitille. editor.cancel=Peruuta @@ -1148,7 +1148,7 @@ pulls.nothing_to_compare=Nämä haarat vastaavat toisiaan. Ei ole tarvetta luoda pulls.nothing_to_compare_and_allow_empty_pr=Nämä haarat vastaavat toisiaan. Vetopyyntö tulee olemaan tyhjä. pulls.has_pull_request=`Vetopyyntö haarojen välillä on jo olemassa: %[2]s#%[3]d` pulls.create=Luo vetopyyntö -pulls.title_desc_few=haluaa yhdistää %[1]d committia lähteestä %[2]s kohteeseen %[3]s +pulls.title_desc_few=haluaa yhdistää %[1]d committia lähteestä %[2]s kohteeseen %[3]s pulls.merged_title_desc_few=yhdistetty %[1]d committia lähteestä %[2]s kohteeseen %[3]s %[4]s pulls.tab_conversation=Keskustelu pulls.tab_commits=Commitit @@ -2447,7 +2447,7 @@ runners.runner_manage_panel = Hallinnoi testinajajia variables = Muuttujat variables.management = Hallinnoi muuttujia variables.creation = Lisää muuttuja -runs.no_workflows.quick_start = Etkö tiedä kuinka Forgejo Actions toimii? Katso aloitusohje. +runs.no_workflows.quick_start = Etkö tiedä kuinka Forgejo Actions toimii? Katso aloitusohje. runners.new = Luo uusi testinajaja runners.version = Versio runs.expire_log_message = Lokitiedostot on tyhjätty vanhenemisen vuoksi. diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini index 6bc508020c..15353be168 100644 --- a/options/locale/locale_fil.ini +++ b/options/locale/locale_fil.ini @@ -766,7 +766,7 @@ ssh_principal_deletion_success = Tinanggal na ang principal. principal_state_desc = Ginamit ang principal na ito sa huling 7 araw tokens_desc = Ang mga token na ito ay nagbibigay ng pag-access sa iyong account gamit ang Forgejo API. generate_token_name_duplicate = Ginamit na ang %s bilang isang pangalan ng application. Gumamit ng bago. -access_token_desc = Ang mga piniling pahintulot sa token ay nililimitahan ang awtorisasyon sa mga kakulang na API route. Basahin ang dokumentasyon para sa higit pang impormasyon. +access_token_desc = Ang mga piniling pahintulot sa token ay nililimitahan ang awtorisasyon sa mga kakulang na API route. Basahin ang dokumentasyon para sa higit pang impormasyon. uploaded_avatar_is_too_big = Ang laki ng na-upload na file (%d KiB) ay lumalagpas sa pinakamalaking laki (%d KiB). update_avatar_success = Nabago na ang iyong avatar. update_user_avatar_success = Nabago na ang avatar ng user. @@ -1482,7 +1482,7 @@ milestones.title = Pamagat milestones.desc = paglalarawan pulls.blocked_by_user = Hindi ka makakagawa ng hiling sa paghila sa repositoryo na ito dahil na-block ka ng may-ari ng repositoryo. pulls.no_merge_access = Hindi ka pinapayagang isali ang [pull request] na ito. -editor.commit_directly_to_this_branch = Direktang mag-commit sa branch na %s. +editor.commit_directly_to_this_branch = Direktang mag-commit sa branch na %[1]s. editor.branch_already_exists = Umiiral na ang branch na "%s" sa repositoryo na ito. editor.file_editing_no_longer_exists = Ang file na ine-edit, "%s", ay hindi na umiiral sa repositoryo na ito. editor.filename_is_a_directory = Ang pangalan ng file "%s" ay ginagamit na bilang pangalan ng direktoryo sa repositoryo na ito. @@ -1584,12 +1584,12 @@ projects.column.new_title = Pangalan projects.card_type.desc = Mga preview ng card commits.desc = I-browse ang history ng pagbabago ng source code. commits.search.tooltip = Maari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09". -issues.force_push_codes = `puwersahang itinulak ang %[1]s mula %[2]s sa %[4]s %[6]s` +issues.force_push_codes = `puwersahang itinulak ang %[1]s mula %[2]s sa %[4]s %[6]s` issues.push_commit_1 = idinagdag ang %d commit %s issues.push_commits_n = idinagdag ang %d mga [commit] %s issues.new.no_reviewers = Walang mga tagasuri -pulls.title_desc_one = hinihiling na isama ang %[1]d commit mula %[2]s patungong %[3]s -pulls.title_desc_few = hiniling na isama ang %[1]d mga commit mula sa %[2]s patungong %[3]s +pulls.title_desc_one = hinihiling na isama ang %[1]d commit mula %[2]s patungong %[3]s +pulls.title_desc_few = hiniling na isama ang %[1]d mga commit mula sa %[2]s patungong %[3]s issues.review.add_review_request = hiniling ang pagsuri mula kay %s %s pulls.status_checks_details = Mga detalye activity.git_stats_author_n = %d mga may-akda diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index e26a36867d..d914b558e8 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -223,7 +223,7 @@ platform_desc=Forgejo est confirmé fonctionner sur des systèmes d'exploitation lightweight=Léger lightweight_desc=Forgejo utilise peu de ressources. Il peut même tourner sur un Raspberry Pi très bon marché. Économisez l'énergie de vos serveurs ! license=Open Source -license_desc=Toutes les sources sont sur Forgejo ! Rejoignez-nous et contribuez à rendre ce projet encore meilleur. Ne craignez pas de devenir un·e contributeur·trice ! +license_desc=Toutes les sources sont sur Forgejo ! Rejoignez-nous et contribuez à rendre ce projet encore meilleur. Ne craignez pas de devenir un·e contributeur·trice ! [install] install=Installation @@ -938,7 +938,7 @@ select_permissions=Sélectionner les autorisations permission_no_access=Aucun accès permission_read=Lecture permission_write=Lecture et écriture -access_token_desc=Les autorisations des jetons sélectionnées se limitent aux routes API correspondantes. Lisez la documentation pour plus d’informations. +access_token_desc=Les autorisations des jetons sélectionnées se limitent aux routes API correspondantes. Lisez la documentation pour plus d’informations. at_least_one_permission=Vous devez sélectionner au moins une permission pour créer un jeton permissions_list=Autorisations : @@ -1360,7 +1360,7 @@ editor.fail_to_apply_patch=`Impossible d'appliquer le correctif "%s"` editor.new_patch=Nouveau correctif editor.commit_message_desc=Ajouter une description détaillée facultative… editor.signoff_desc=Créditer l'auteur "Signed-off-by:" en pied de révision. -editor.commit_directly_to_this_branch=Réviser directement dans la branche %s. +editor.commit_directly_to_this_branch=Réviser directement dans la branche %[1]s. editor.create_new_branch=Créer une nouvelle branche pour cette révision et initier une demande d'ajout. editor.create_new_branch_np=Créer une nouvelle branche pour cette révision. editor.propose_file_change=Proposer une modification du fichier @@ -1726,7 +1726,7 @@ issues.error_modifying_due_date=Impossible de modifier l'échéance. issues.error_removing_due_date=Impossible de supprimer l'échéance. issues.push_commit_1=a ajouté %d révision %s issues.push_commits_n=a ajouté %d révisions %s -issues.force_push_codes=`a forcé %[1]s de %[2]s à %[4]s %[6]s.` +issues.force_push_codes=`a forcé %[1]s de %[2]s à %[4]s %[6]s.` issues.force_push_compare=Comparer issues.due_date_form=aaaa-mm-jj issues.due_date_form_add=Ajouter une échéance @@ -1841,7 +1841,7 @@ pulls.nothing_to_compare=Ces branches sont identiques. Il n’y a pas besoin de pulls.nothing_to_compare_and_allow_empty_pr=Ces branches sont égales. Cette demande d'ajout sera vide. pulls.has_pull_request='Il existe déjà une demande d'ajout entre ces deux branches : %[2]s#%[3]d' pulls.create=Créer une demande d'ajout -pulls.title_desc_few=souhaite fusionner %[1]d révision(s) depuis %[2]s vers %[3]s +pulls.title_desc_few=souhaite fusionner %[1]d révision(s) depuis %[2]s vers %[3]s pulls.merged_title_desc_few=a fusionné %[1]d révision(s) à partir de %[2]s vers %[3]s %[4]s pulls.change_target_branch_at=`a remplacée la branche cible %s par %s %s` pulls.tab_conversation=Discussion @@ -2765,7 +2765,7 @@ error.broken_git_hook = Les hooks Git de ce dépôt semblent cassés. Référez settings.confirmation_string = Chaine de confirmation pulls.agit_explanation = Créé par le workflow AGit. AGit permet aux contributeurs de proposer des modifications en utilisant "git push" sans créer une bifurcation ou une nouvelle branche. pulls.merged_title_desc_one = fusionné %[1]d commit depuis %[2]s vers %[3]s %[4]s -pulls.title_desc_one = veut fusionner %[1]d commit depuis %[2]s vers %[3]s +pulls.title_desc_one = veut fusionner %[1]d commit depuis %[2]s vers %[3]s stars = Étoiles n_tag_few = %s étiquettes editor.commit_id_not_matching = Le fichier a été modifié pendant que vous l'éditiez. Appliquez les modifications à une nouvelle branche puis procédez à la fusion. diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini index 94e915e3bf..74108be0c8 100644 --- a/options/locale/locale_gl.ini +++ b/options/locale/locale_gl.ini @@ -181,8 +181,7 @@ user_kind = Buscar usuarios... platform = Multiplataforma app_desc = Um servizo Git autoxestionado e fácil de usar install = Fácil de instalar -platform_desc = Forgejo execútase en calquera lugar onde Go poida compilar para: Windows, MacOS, Linux, ARM, etc. Escolla seu preferido! -install_desc = Simplemente executa o binario para a túa plataforma, envíao con < un target="_blank" rel="noopener noreferrer" href="%[2]s">Docker ou consígueo empaquetado. +install_desc = Simplemente executa o binario para a túa plataforma, envíao con Docker ou consígueo empaquetado. [error] occurred = Ocorreu un erro diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index fd6d48d8b0..aae5a6ad71 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -203,7 +203,6 @@ not_found = A cél nem található. app_desc=Fájdalommentes, saját gépre telepíthető Git szolgáltatás install=Könnyen telepíthető platform=Keresztplatformos -platform_desc=A Forgejo minden platformon fut, ahol a Go fordíthat: Windows, macOS, Linux, ARM, stb. Válassza azt, amelyet szereti! lightweight=Könnyűsúlyú license=Nyílt forráskódú @@ -812,7 +811,7 @@ editor.cancel_lower=Mégse editor.commit_changes=Változások Véglegesítése editor.add_tmpl='' hozzáadása editor.commit_message_desc=Opcionális hosszabb leírás hozzáadása… -editor.commit_directly_to_this_branch=Mentés egyenesen a(z) %s ágba. +editor.commit_directly_to_this_branch=Mentés egyenesen a(z) %[1]s ágba. editor.create_new_branch=Hozzon létre egy új ágat ennek a commit-nak és indíts egy egyesítési kérést. editor.propose_file_change=Változtatás ajánlása editor.new_branch_name_desc=Új ág neve… @@ -1033,7 +1032,7 @@ pulls.filter_branch=Ágra szűrés pulls.no_results=Nincs találat. pulls.nothing_to_compare=Ezek az ágak egyenlőek. Nincs szükség egyesítési kérésre. pulls.create=Egyesítési kérés létrehozása -pulls.title_desc_few=egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s-ból %[3]s-ba +pulls.title_desc_few=egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s-ból %[3]s-ba pulls.merged_title_desc_few=egyesítve %[1]d változás(ok) a %[2]s-ból %[3]s-ba %[4]s pulls.tab_conversation=Beszélgetés pulls.tab_commits=Commit-ok diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 36f1265c3e..5cd3033119 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -98,7 +98,6 @@ name=Nama app_desc=Sebuah layanan hosting Git sendiri yang tanpa kesulitan install=Mudah dipasang platform=Lintas platform -platform_desc=Forgejo bisa digunakan di mana Go bisa dijalankan: Windows, macOS, Linux, ARM, dll. Silahkan pilih yang Anda suka! lightweight=Ringan lightweight_desc=Forgejo hanya membutuhkan persyaratan minimal dan bisa berjalan pada Raspberry Pi yang murah. Bisa menghemat listrik! license=Sumber Terbuka @@ -623,7 +622,7 @@ editor.cancel_lower=Batalkan editor.commit_changes=Perubahan komitmen editor.add_tmpl=Tambahkan '' editor.commit_message_desc=Tambahkan deskripsi opsional yang panjang… -editor.commit_directly_to_this_branch=Komitmen langsung ke %s cabang. +editor.commit_directly_to_this_branch=Komitmen langsung ke %[1]s cabang. editor.create_new_branch=Membuat new branch untuk tarik komit ini mulai permintaan. editor.create_new_branch_np=Buat cabang baru untuk komit ini. editor.propose_file_change=Usul perubahan berkas @@ -752,7 +751,7 @@ pulls.compare_changes=Permintaan Tarik Baru pulls.filter_branch=Penyaringan cabang pulls.no_results=Hasil tidak ditemukan. pulls.create=Buat Permintaan Tarik -pulls.title_desc_few=ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s +pulls.title_desc_few=ingin menggabungkan komit %[1]d dari %[2]s menuju %[3]s pulls.merged_title_desc_few=commit %[1]d telah digabungkan dari %[2]s menjadi %[3]s %[4]s pulls.tab_conversation=Percakapan pulls.tab_commits=Melakukan diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini index 0cb6c0f7ab..b07bf4b829 100644 --- a/options/locale/locale_is-IS.ini +++ b/options/locale/locale_is-IS.ini @@ -133,7 +133,6 @@ network_error=Netkerfisvilla app_desc=Þrautalaus og sjálfhýst Git þjónusta install=Einföld uppsetning platform=Fjölvettvangur -platform_desc=Forgejo virkar hvar sem að Go gerir: Linux, macOS, Windows, ARM o. s. frv. Veldu það sem þú vilt! lightweight=Létt lightweight_desc=Forgejo hefur lágar lágmarkskröfur og getur keyrt á ódýrum Raspberry Pi. Sparaðu orku! license=Frjáls Hugbúnaður @@ -891,7 +890,7 @@ pulls.new=Ný Sameiningarbeiðni pulls.view=Skoða Sameiningarbeiðni pulls.compare_changes=Ný Sameiningarbeiðni pulls.create=Skapa Sameiningarbeiðni -pulls.title_desc_few=vill sameina %[1]d framlög frá %[2]s í %[3]s +pulls.title_desc_few=vill sameina %[1]d framlög frá %[2]s í %[3]s pulls.tab_conversation=Umræða pulls.tab_commits=Framlög pulls.tab_files=Skráum Breytt diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index dc58d62c7c..361c9821f3 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -217,7 +217,6 @@ server_internal = Errore interno del server app_desc=Un servizio auto-ospitato per Git pronto all'uso install=Facile da installare platform=Multipiattaforma -platform_desc=Forgejo funziona ovunque Go possa essere compilato: Windows, macOS, Linux, ARM, etc. Scegli ciò che ami! lightweight=Leggero lightweight_desc=Forgejo ha requisiti minimi bassi e può funzionare su un economico Raspberry Pi. Risparmia l'energia della tua macchina! license=Open Source @@ -1000,7 +999,7 @@ valid_until_date = Valido fino a %s ssh_signonly = SSH è attualmente disabilitato quindi queste chiavi sono usate solo per la firma di verifica dei commit. social_desc = Questi profili social possono essere usati per accedere al tuo profilo. Assicurati di riconoscerli tutti. permission_write = Leggi e scrivi -access_token_desc = I permessi token selezionati limitano l'autorizzazione solo alle corrispondenti vie API. Leggi la documentazione per ulteriori informazioni. +access_token_desc = I permessi token selezionati limitano l'autorizzazione solo alle corrispondenti vie API. Leggi la documentazione per ulteriori informazioni. create_oauth2_application_success = Hai correttamente creato una nuova applicazione OAuth2. update_oauth2_application_success = Hai correttamente aggiornato l'applicazione OAuth2. oauth2_redirect_uris = URI per la reindirizzazione. Usa una nuova riga per ogni URI. @@ -1305,7 +1304,7 @@ editor.patching=Patching: editor.new_patch=Nuova Patch editor.commit_message_desc=Aggiungi una descrizione estesa facoltativa… editor.signoff_desc=Aggiungi "firmato da" dal committer alla fine del messaggio di log di commit. -editor.commit_directly_to_this_branch=Fai un commit direttamente sul ramo %s. +editor.commit_directly_to_this_branch=Fai un commit direttamente sul ramo %[1]s. editor.create_new_branch=Crea un nuovo ramo per questo commit e avvia una richiesta di modifica. editor.create_new_branch_np=Crea un nuovo ramo per questo commit. editor.propose_file_change=Proponi la modifica del file @@ -1596,7 +1595,7 @@ issues.error_modifying_due_date=Impossibile modificare la scadenza. issues.error_removing_due_date=Impossibile rimuovere la scadenza. issues.push_commit_1=ha aggiunto %d commit %s issues.push_commits_n=ha aggiunto %d commit %s -issues.force_push_codes=`ha forzato l'immissione %[1]s da %[2]s a %[4]s %[6]s` +issues.force_push_codes=`ha forzato l'immissione %[1]s da %[2]s a %[4]s %[6]s` issues.force_push_compare=Confronta issues.due_date_form=aaaa-mm-dd issues.due_date_form_add=Aggiungi scadenza @@ -1693,7 +1692,7 @@ pulls.nothing_to_compare=Questi rami sono uguali. Non c'è bisogno di creare una pulls.nothing_to_compare_and_allow_empty_pr=Questi rami sono uguali. Questa richiesta sarà vuota. pulls.has_pull_request=`Una richiesta di modifica fra questi rami esiste già: %[2]s#%[3]d` pulls.create=Crea richiesta di modifica -pulls.title_desc_few=vuole unire %[1]d commit da %[2]s a %[3]s +pulls.title_desc_few=vuole unire %[1]d commit da %[2]s a %[3]s pulls.merged_title_desc_few=ha unito %[1]d commit da %[2]s a %[3]s %[4]s pulls.change_target_branch_at=`cambiato il ramo di destinazione da %s a %s %s` pulls.tab_conversation=Conversazione @@ -2740,7 +2739,7 @@ settings.ignore_stale_approvals = Ignora approvazioni stantie settings.protected_branch_required_rule_name = Nome regola richiesta settings.protect_status_check_patterns_desc = Inserisci sequenze per specificare quali controlli dello stato devono passare prima che i rami possano essere fusi con i rami che soddisfano questa regola. Ogni riga specifica una sequenza. Le sequenze non possono essere vuote. settings.authorization_header_desc = Verrà inclusa come intestazione dell'autorizzazione per le richieste quando presente. Esempi: %s. -pulls.title_desc_one = vuole fondere %[1]d commit da %[2]s in %[3]s +pulls.title_desc_one = vuole fondere %[1]d commit da %[2]s in %[3]s settings.protect_unprotected_file_patterns_desc = File non protetti dei quali è consentita la modifica direttamente se l'utente ha permesso di scrittura, saltandole restrizioni di immissione. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su %[2]s per la sintassi delle sequenze glob. Esempi .drone.yml, /docs/**/*.txt. settings.protect_protected_file_patterns_desc = I file non protetti non possono essere modificati direttamente neanche se l'utente ha il permesso di aggiungere, modificare o eliminare file in questo ramo. Più sequenze possono essere separate usando il punto e virgola (";"). Vedi la documentazione su %s per la sintassi della sequenze. Esempi: .drone.yml, /docs/**/*.txt. settings.protect_no_valid_status_check_patterns = Nessuna sequenza valida per il controllo dello stato. diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 3e90125042..c4988edd6e 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -218,7 +218,6 @@ app_desc=自分で立てる、超簡単 Git サービス install=簡単インストール install_desc=シンプルに、プラットフォームに応じてバイナリを実行したり、Dockerで動かしたり、パッケージを使うだけ。 platform=クロスプラットフォーム -platform_desc=ForgejoはGoでコンパイルできる環境ならどこでも動きます: Windows、macOS、Linux、ARM等々、好きなものを選んでください! lightweight=軽量 lightweight_desc=Forgejo の最小動作要件は小さくて、安価な Raspberry Pi でも動きます。エネルギー消費を節約しましょう! license=オープンソース @@ -934,7 +933,7 @@ select_permissions=許可の選択 permission_no_access=アクセス不可 permission_read=読み取り permission_write=読み取りと書き込み -access_token_desc=選択したトークン権限に応じて、関連するAPIルートのみに許可が制限されます。 詳細はドキュメントを参照してください。 +access_token_desc=選択したトークン権限に応じて、関連するAPIルートのみに許可が制限されます。 詳細はドキュメントを参照してください。 at_least_one_permission=トークンを作成するには、少なくともひとつの許可を選択する必要があります permissions_list=許可: @@ -1355,7 +1354,7 @@ editor.fail_to_apply_patch=`パッチを適用できません "%s"` editor.new_patch=新しいパッチ editor.commit_message_desc=詳細な説明を追加… editor.signoff_desc=コミットログメッセージの最後にコミッターの Signed-off-by 行を追加 -editor.commit_directly_to_this_branch=ブランチ%sへ直接コミットする。 +editor.commit_directly_to_this_branch=ブランチ%[1]sへ直接コミットする。 editor.create_new_branch=新しいブランチにコミットしてプルリクエストを作成する。 editor.create_new_branch_np=新しいブランチにコミットする。 editor.propose_file_change=ファイル修正を提案 @@ -1721,7 +1720,7 @@ issues.error_modifying_due_date=期日を変更できませんでした。 issues.error_removing_due_date=期日を削除できませんでした。 issues.push_commit_1=が %d コミット追加 %s issues.push_commits_n=が %d コミット追加 %s -issues.force_push_codes=`が %[1]s を強制プッシュ ( %[2]s から %[4]s へ ) %[6]s` +issues.force_push_codes=`が %[1]s を強制プッシュ ( %[2]s から %[4]s へ ) %[6]s` issues.force_push_compare=比較 issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=期日の追加 @@ -1836,7 +1835,7 @@ pulls.nothing_to_compare=同じブランチ同士のため、 プルリクエス pulls.nothing_to_compare_and_allow_empty_pr=これらのブランチは内容が同じです。 空のプルリクエストになります。 pulls.has_pull_request=`同じブランチのプルリクエストはすでに存在します: %[2]s#%[3]d` pulls.create=プルリクエストを作成 -pulls.title_desc_few=が %[2]s から %[3]s への %[1]d コミットのマージを希望しています +pulls.title_desc_few=が %[2]s から %[3]s への %[1]d コミットのマージを希望しています pulls.merged_title_desc_few=が %[1]d 個のコミットを %[2]s から %[3]s へマージ %[4]s pulls.change_target_branch_at=`がターゲットブランチを %s から %s に変更 %s` pulls.tab_conversation=会話 @@ -2779,7 +2778,7 @@ issues.archived_label_description = (アーカイブ済) %s settings.web_hook_name_sourcehut_builds = SourceHut Builds settings.matrix.room_id_helper = ルームIDは、Element web clientのRoom Settings > Advanced > Internal room IDから取得できます。例:%s。 pulls.merged_title_desc_one = %[4]s の %[2]s から %[1]d 件のコミットを %[3]s へマージした -pulls.title_desc_one = %[3]s から %[1]d 件のコミットを %[2]s へマージしたい +pulls.title_desc_one = %[3]s から %[1]d 件のコミットを %[2]s へマージしたい pulls.ready_for_review = レビューの準備ができていますか? settings.transfer.button = 所有権を移送する settings.transfer.modal.title = 所有権を移送 diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 9c5b6ca3c1..5b90b1020b 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -778,7 +778,7 @@ editor.or=혹은 editor.cancel_lower=취소 editor.commit_changes=변경 내용을 커밋 editor.commit_message_desc=선택적 확장 설명 추가… -editor.commit_directly_to_this_branch=%s 브랜치에서 직접 커밋해주세요. +editor.commit_directly_to_this_branch=%[1]s 브랜치에서 직접 커밋해주세요. editor.create_new_branch=이 커밋에 대한 새로운 브랜치를 만들고 끌어오기 요청을 시작합니다. editor.new_branch_name_desc=새로운 브랜치 이름… editor.cancel=취소 @@ -973,7 +973,7 @@ pulls.compare_compare=다음으로부터 풀 pulls.filter_branch=Filter Branch pulls.no_results=결과를 찾을 수 없습니다. pulls.create=풀 리퀘스트 생성 -pulls.title_desc_few=%[2]s 에서 %[3]s 로 %[1]d개의 커밋들을 병합하려함 +pulls.title_desc_few=%[2]s 에서 %[3]s 로 %[1]d개의 커밋들을 병합하려함 pulls.merged_title_desc_few=님이 %[2]s 에서 %[3]s 로 %[1]d 커밋을 %[4]s 병합함 pulls.tab_conversation=대화 pulls.tab_commits=커밋 @@ -1081,7 +1081,6 @@ contributors.contribution_type.commits=커밋 search=검색 search.search_repo=저장소 검색 -search.results="%s 에서 \"%s\" 에 대한 검색 결과" search.code_no_results=검색어와 일치하는 소스코드가 없습니다. settings=설정 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 48c739bb30..aeaddf3b9c 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -187,7 +187,6 @@ app_desc=Viegli uzstādāms Git serviss install=Vienkārši instalējams install_desc=Vienkārši jāpalaiž izpildāmais fails vajadzīgajai platformai, jāizmanto Docker, vai jāiegūst pakotne. platform=Pieejama dažādām platformām -platform_desc=Forgejo iespējams uzstādīt jebkur, kam Go var nokompilēt: Windows, macOS, Linux, ARM utt. Izvēlies to, kas tev patīk! lightweight=Viegla lightweight_desc=Forgejo ir miminālas prasības un to var darbināt uz nedārga Raspberry Pi datora. Ietaupi savai ierīcei resursus! license=Atvērtā pirmkoda @@ -830,7 +829,7 @@ select_permissions=Norādiet tiesības permission_no_access=Nav piekļuves permission_read=Skatīšanās permission_write=Skatīšanās un raksīšanas -access_token_desc=Atzīmētie pilnvaras apgabali ierobežo autentifikāciju tikai atbilstošiem API izsaukumiem. Sīkāka informācija pieejama dokumentācijā. +access_token_desc=Atzīmētie pilnvaras apgabali ierobežo autentifikāciju tikai atbilstošiem >API izsaukumiem. Sīkāka informācija pieejama >dokumentācijā. at_least_one_permission=Nepieciešams norādīt vismaz vienu tiesību, lai izveidotu pilnvaru permissions_list=Tiesības: @@ -1231,7 +1230,7 @@ editor.fail_to_apply_patch=`Neizdevās pielietot ielāpu "%s"` editor.new_patch=Jauns ielāps editor.commit_message_desc=Pievienot neobligātu paplašinātu aprakstu… editor.signoff_desc=Pievienot revīzijas žurnāla ziņojuma beigās Signed-off-by ar revīzijas autoru. -editor.commit_directly_to_this_branch=Apstiprināt revīzijas izmaiņas atzarā %s. +editor.commit_directly_to_this_branch=Apstiprināt revīzijas izmaiņas atzarā %[1]s. editor.create_new_branch=Izveidot jaunu atzaru un izmaiņu pieprasījumu šai revīzijai. editor.create_new_branch_np=Izveidot jaunu atzaru šai revīzijai. editor.propose_file_change=Ieteikt faila izmaiņas @@ -1597,7 +1596,7 @@ issues.error_modifying_due_date=Neizdevās izmainīt izpildes termiņu. issues.error_removing_due_date=Neizdevās noņemt izpildes termiņu. issues.push_commit_1=iesūtīja %d revīziju %s issues.push_commits_n=iesūtīja %d revīzijas %s -issues.force_push_codes=`veica piespiedu izmaiņu iesūtīšanu atzarā %[1]s no revīzijas %[2]s uz %[4]s %[6]s` +issues.force_push_codes=`veica piespiedu izmaiņu iesūtīšanu atzarā %[1]s no revīzijas %[2]s uz %[4]s %[6]s` issues.force_push_compare=Salīdzināt issues.due_date_form=dd.mm.yyyy issues.due_date_form_add=Pievienot izpildes termiņu @@ -1712,7 +1711,7 @@ pulls.nothing_to_compare=Nav ko salīdzināt, jo bāzes un salīdzināmie atzari pulls.nothing_to_compare_and_allow_empty_pr=Šie atzari ir vienādi. Izveidotais izmaiņu pieprasījums būs tukšs. pulls.has_pull_request=`Izmaiņu pieprasījums starp šiem atzariem jau eksistē: %[2]s#%[3]d` pulls.create=Izveidot izmaiņu pieprasījumu -pulls.title_desc_few=vēlas sapludināt %[1]d revīzijas no %[2]s uz %[3]s +pulls.title_desc_few=vēlas sapludināt %[1]d revīzijas no %[2]s uz %[3]s pulls.merged_title_desc_few=sapludināja %[1]d revīzijas no %[2]s uz %[3]s %[4]s pulls.change_target_branch_at=`nomainīja mērķa atzaru no %s uz %s %s` pulls.tab_conversation=Saruna diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini index f59e0151a3..46c27fbea1 100644 --- a/options/locale/locale_nds.ini +++ b/options/locale/locale_nds.ini @@ -839,7 +839,7 @@ add_email_confirmation_sent = Eene Utwiesens-E-Mail is an »%s« schickt worden. ssh_desc = Deese publiken SSH-Slötels sünd mit dienem Konto verbunnen. De tohörig privaate Slötel gifft kumpleten Togriep up diene Repositoriums. SSH-Slötels, wat utwiest worden sünd, könen bruukt worden, um SSH-unnerschreven Git-Kommitterens uttowiesen. keep_email_private_popup = Dat word diene E-Mail-Adress vun dienem Profil verburgen. Dann is dat nich mehr de Normaalweert för Kommitterens, wat du över de Internett-Schnittstee maakst, so as Datei-Upladens un Bewarkens, un word nich in Tosamenföhrens-Kommitterens bruukt. In Stee daarvun kann eene besünnere Adress %s bruukt worden, um Kommitterens mit dienem Konto to verbinnen. Wees wiss, dat dat Ännern vun deeser Instellen bestahn Kommitterens nich ännert. ssh_helper = Bruukst du Hülp? Kiek de Inföhren an, wo du diene eegenen SSH-Slötels maakst of hülp gewohnten Probleemen of, över wat man mit SSH mennigmaal strukelt. -access_token_desc = Utköört Teken-Verlöövnissen begrenzen dat Anmellen blots up de tohörig API-Padden. Lees de Dokumenteren för mehr Informatioonen. +access_token_desc = Utköört Teken-Verlöövnissen begrenzen dat Anmellen blots up de tohörig API-Padden. Lees de Dokumenteren för mehr Informatioonen. oauth2_confidential_client = Diskreeter Klient. Köör dat för Programmen ut, wat dat Geheimnis diskreet behanneln, as Internett-Sieden. Köör dat nich för stedenwies Programmen ut, as Schrievdisk- un Telefoon-Programmens. gpg_helper = Bruukst du Hülp? Kiek de Inföhren över GPG an. gpg_desc = Deese publiken GPG-Slötels sünd mit dienem Konto verbunnen un worden bruukt, um diene Kommitterens uttowiesen. Holl de tohörig privaaten Slötels seker, denn daarmit kann man Kommitterens mit diener Unnerschrift unnerschrieven. @@ -1126,7 +1126,7 @@ editor.patching = Plackt: editor.fail_to_apply_patch = Kann Plack »%s« nich anwennen editor.new_patch = Nejer Plack editor.commit_message_desc = Wenn du willst, föög een wiederes Beschrieven hento … -editor.commit_directly_to_this_branch = Kommitteer stracks up de %s-Twieg. +editor.commit_directly_to_this_branch = Kommitteer stracks up de %[1]s-Twieg. editor.propose_file_change = Datei-Ännern vörslagen editor.new_branch_name = Benööm de Twieg för deeses Kommitteren editor.new_branch_name_desc = Nejer Twig-Naam … @@ -1561,7 +1561,7 @@ issues.due_date_invalid = Dat Anstahns-Datum is ungültig of buten de Rieg. Bidd issues.dependency.remove = Wegdoon issues.dependency.issue_close_blocks = Deeses Gefall blockeert dat Dichtmaken vun deesen Gefallens issues.review.outdated_description = Inholl hett sik ännert, siet deeser Kommentaar schreven worden is -issues.force_push_codes = `hett %[1]s vun %[2]s to %[4]s %[6]s dwangsschuven` +issues.force_push_codes = `hett %[1]s vun %[2]s to %[4]s %[6]s dwangsschuven` issues.dependency.pr_remove_text = Dat word de Ofhangen vun deesem Haalvörslag wegdoon. Wiedermaken? issues.review.pending = Staht ut issues.review.option.hide_outdated_comments = Verollte Kommentarens verbargen @@ -1599,7 +1599,7 @@ pulls.filter_changes_by_commit = Na Kommitteren filtern pulls.nothing_to_compare = Deese Twiegen sünd gliek. ’t is nich nödig, eenen Haalvörslag to maken. pulls.nothing_to_compare_have_tag = De utköört Twieg/Mark sünd gliek. pulls.create = Haalvörslag maken -pulls.title_desc_one = will %[1]d Kommitteren vun %[2]s na %[3]s tosamenföhren +pulls.title_desc_one = will %[1]d Kommitteren vun %[2]s na %[3]s tosamenföhren pulls.merged_title_desc_one = hett %[1]d Kommitteren vun %[2]s na %[3]s %[4]s tosamenföhrt pulls.change_target_branch_at = `hett de Enn-Twieg vun %s to %s %s ännert` pulls.tab_conversation = Snack @@ -1649,7 +1649,7 @@ issues.content_history.delete_from_history = Ut Histoorje lösken pulls.compare_changes = Nejer Haalvörslag pulls.allow_edits_from_maintainers_desc = Brukers, well dat Recht hebben, to de Grund-Twieg to schrieven, düren ok up deesen Twieg schuuven pulls.nothing_to_compare_and_allow_empty_pr = Deese Twiegen sünd gliek. De HV word leeg wesen. -pulls.title_desc_few = will %[1]d Kommitterens vun %[2]s na %[3]s tosamenföhren +pulls.title_desc_few = will %[1]d Kommitterens vun %[2]s na %[3]s tosamenföhren pulls.data_broken = Deeser Haalvörslag is kaputt, denn de Gabel-Informatioon fehlt. pulls.waiting_count_1 = %d Nakieken staht ut issues.content_history.deleted = lösket diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index cbf418f9be..6f2bee0145 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -1028,7 +1028,7 @@ visibility.private_tooltip = Alleen zichtbaar voor leden van organisaties waarbi user_unblock_success = De gebruiker is succesvol gedeblokkeerd. user_block_success = De gebruiker is succesvol geblokkeerd. blocked_since = Geblokkeerd sinds %s -access_token_desc = Geselecteerde token machtigingen beperken autorisatie alleen tot de bijbehorende API routes. Lees de documentatie voor meer informatie. +access_token_desc = Geselecteerde token machtigingen beperken autorisatie alleen tot de bijbehorende API routes. Lees de documentatie voor meer informatie. oauth2_confidential_client = Vertrouwelijke client. Selecteer deze optie voor apps die het geheim bewaren, zoals webapps. Niet selecteren voor native apps, waaronder desktop- en mobiele apps. authorized_oauth2_applications_description = Je hebt deze applicaties van derden toegang verleend tot je persoonlijke Forgejo-account. Trek de toegang in voor applicaties die niet langer in gebruik zijn. hidden_comment_types.ref_tooltip = Reacties waarbij naar deze issue werd verwezen vanuit een ander issue/commit/… @@ -1309,7 +1309,7 @@ editor.patching=Patchen: editor.new_patch=Nieuwe patch editor.commit_message_desc=Voeg een optionele uitgebreide omschrijving toe… editor.signoff_desc=Voeg een Signed-off-by toe aan het einde van het commit logbericht. -editor.commit_directly_to_this_branch=Commit direct naar de branch '%s'. +editor.commit_directly_to_this_branch=Commit direct naar de branch '%[1]s'. editor.create_new_branch=Maak een nieuwe branch voor deze commit en start van een pull request. editor.create_new_branch_np=Maak een nieuwe branch voor deze commit. editor.propose_file_change=Stel bestandswijziging voor @@ -1599,7 +1599,7 @@ issues.error_modifying_due_date=Deadline aanpassen mislukt. issues.error_removing_due_date=Deadline verwijderen mislukt. issues.push_commit_1=toegevoegd %d commit %s issues.push_commits_n=toegevoegd %d commits %s -issues.force_push_codes=`force-push %[1]s van %[2]s naar %[4]s %[6]s` +issues.force_push_codes=`force-push %[1]s van %[2]s naar %[4]s %[6]s` issues.force_push_compare=Vergelijk issues.due_date_form=jjjj-mm-dd issues.due_date_form_add=Vervaldatum toevoegen @@ -1696,7 +1696,7 @@ pulls.nothing_to_compare=Deze branches zijn gelijk. Er is geen pull request nodi pulls.nothing_to_compare_and_allow_empty_pr=Deze branches zijn gelijk. Deze pull verzoek zal leeg zijn. pulls.has_pull_request=`Een pull-verzoek tussen deze branches bestaat al: %[2]s#%[3]d` pulls.create=Pull request aanmaken -pulls.title_desc_few=wilt %[1]d commits van %[2]s samenvoegen met %[3]s +pulls.title_desc_few=wilt %[1]d commits van %[2]s samenvoegen met %[3]s pulls.merged_title_desc_few=heeft %[1]d commits samengevoegd van %[2]s naar %[3]s %[4]s pulls.change_target_branch_at='doelbranch aangepast van %s naar %s %s' pulls.tab_conversation=Discussie @@ -2745,7 +2745,7 @@ activity.navbar.code_frequency = Code frequentie activity.navbar.recent_commits = Recente commits file_follow = Volg symlink error.broken_git_hook = it hooks van deze repository lijken kapot te zijn. Volg alsjeblieft de documentatie om ze te repareren, push daarna wat commits om de status te vernieuwen. -pulls.title_desc_one = wilt %[1]d commit van %[2]s samenvoegen in %[3]s +pulls.title_desc_one = wilt %[1]d commit van %[2]s samenvoegen in %[3]s open_with_editor = Open met %s commits.search_branch = Deze branch pulls.merged_title_desc_one = heeft %[1]d commit van %[2]s samengevoegd in %[3]s %[4]s diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index cecafc9870..7a5cb42b1e 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1152,7 +1152,7 @@ editor.commit_signed_changes=Zatwierdź podpisane zmiany editor.commit_changes=Zatwierdź zmiany editor.add_tmpl=Dodanie '' editor.commit_message_desc=Dodaj dodatkowy rozszerzony opis… -editor.commit_directly_to_this_branch=Zmieniaj bezpośrednio gałąź %s. +editor.commit_directly_to_this_branch=Zmieniaj bezpośrednio gałąź %[1]s. editor.create_new_branch=Stwórz nową gałąź dla tego commita i rozpocznij Pull Request. editor.create_new_branch_np=Stwórz nową gałąź dla tego commita. editor.propose_file_change=Zaproponuj zmiany w pliku @@ -1482,7 +1482,7 @@ pulls.no_results=Nie znaleziono wyników. pulls.nothing_to_compare=Te gałęzie są sobie równe. Nie ma potrzeby tworzyć Pull Requesta. pulls.nothing_to_compare_and_allow_empty_pr=Te gałęzie są równe. Ten PR będzie pusty. pulls.create=Utwórz Pull Request -pulls.title_desc_few=chce scalić %[1]d commity/ów z %[2]s do %[3]s +pulls.title_desc_few=chce scalić %[1]d commity/ów z %[2]s do %[3]s pulls.merged_title_desc_few=scala %[1]d commity/ów z %[2]s do %[3]s %[4]s pulls.change_target_branch_at=`zmienia gałąź docelową z %s na %s %s` pulls.tab_conversation=Dyskusja diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 73211f7139..a941f270e4 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -217,7 +217,6 @@ server_internal = Erro interno do servidor app_desc=Um serviço de hospedagem Git amigável install=Fácil de instalar platform=Multi-plataforma -platform_desc=Forgejo roda em qualquer sistema em que Go consegue compilar: Windows, macOS, Linux, ARM, etc. Escolha qual você gosta mais! lightweight=Leve e rápido lightweight_desc=Forgejo utiliza poucos recursos e consegue mesmo rodar no barato Raspberry Pi. Economize energia elétrica da sua máquina! license=Código aberto @@ -1032,7 +1031,7 @@ user_block_success = O usuário foi bloqueado. twofa_recovery_tip = Caso perca o seu dispositivo, você poderá usar uma chave de uso único para recuperar o acesso à sua conta. webauthn_key_loss_warning = Caso perca as suas chaves de segurança, você perderá o acesso à sua conta. blocked_users_none = Nenhum usuário bloqueado. -access_token_desc = As permissões selecionadas para o token limitam o acesso apenas às rotas da API correspondentes. Veja a documentação para mais informações. +access_token_desc = As permissões selecionadas para o token limitam o acesso apenas às rotas da API correspondentes. Veja a documentação para mais informações. webauthn_alternative_tip = Você talvez queira configurar um método adicional de autenticação. change_password = Alterar senha hints = Dicas @@ -1344,7 +1343,7 @@ editor.fail_to_apply_patch=`Não foi possível aplicar a correção "%s"` editor.new_patch=Novo patch editor.commit_message_desc=Adicione uma descrição detalhada (opcional)... editor.signoff_desc=Adicione um assinado-por-committer no final do log do commit. -editor.commit_directly_to_this_branch=Commit diretamente no branch %s. +editor.commit_directly_to_this_branch=Commit diretamente no branch %[1]s. editor.create_new_branch=Crie um novo branch para este commit e crie um pull request. editor.create_new_branch_np=Crie um novo branch para este commit. editor.propose_file_change=Propor alteração de arquivo @@ -1699,7 +1698,7 @@ issues.error_modifying_due_date=Falha ao modificar a data limite. issues.error_removing_due_date=Falha ao remover a data limite. issues.push_commit_1=adicionou %d commit %s issues.push_commits_n=adicionou %d commits %s -issues.force_push_codes=`forçou o push %[1]s de %[2]s para %[4]s %[6]s` +issues.force_push_codes=`forçou o push %[1]s de %[2]s para %[4]s %[6]s` issues.force_push_compare=Comparar issues.due_date_form=dd/mm/aaaa issues.due_date_form_add=Adicionar data limite @@ -1813,7 +1812,7 @@ pulls.nothing_to_compare=Estes branches são iguais. Não há nenhuma necessidad pulls.nothing_to_compare_and_allow_empty_pr=Estes branches são iguais. Este PR ficará vazio. pulls.has_pull_request=`Um pull request entre esses branches já existe: %[2]s#%[3]d` pulls.create=Criar pull request -pulls.title_desc_few=quer mesclar %[1]d commits de %[2]s em %[3]s +pulls.title_desc_few=quer mesclar %[1]d commits de %[2]s em %[3]s pulls.merged_title_desc_few=mesclou %[1]d commits de %[2]s em %[3]s %[4]s pulls.change_target_branch_at=`mudou o branch de destino de %s para %s %s` pulls.tab_conversation=Conversação @@ -2691,7 +2690,7 @@ settings.confirm_wiki_branch_rename = Renomar o ramo da wiki pulls.merged_title_desc_one = mesclou %[1]d commit de %[2]s em %[3]s %[4]s activity.navbar.recent_commits = Commits recentes size_format = %[1]s: %[2]s; %[3]s: %[4]s -pulls.title_desc_one = quer mesclar %[1]d commit de %[2]s em %[3]s +pulls.title_desc_one = quer mesclar %[1]d commit de %[2]s em %[3]s pulls.cmd_instruction_merge_desc = Mescle as alterações e enviar para o Forgejo. pulls.ready_for_review = Pronto para revisão? commits.search_branch = Este ramo diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini index d368402a6a..8a2279fe8a 100644 --- a/options/locale/locale_pt-PT.ini +++ b/options/locale/locale_pt-PT.ini @@ -934,7 +934,7 @@ select_permissions=Escolher permissões permission_no_access=Sem acesso permission_read=Lidas permission_write=Leitura e escrita -access_token_desc=As permissões dos códigos escolhidos limitam a autorização apenas às rotas da API correspondentes. Leia a documentação para obter mais informação. +access_token_desc=As permissões dos códigos escolhidos limitam a autorização apenas às rotas da API correspondentes. Leia a documentação para obter mais informação. at_least_one_permission=Tem que escolher pelo menos uma permissão para criar um código permissions_list=Permissões: @@ -1358,7 +1358,7 @@ editor.fail_to_apply_patch=`Não foi possível aplicar o remendo (patch) "%s"` editor.new_patch=Novo remendo (patch) editor.commit_message_desc=Adicionar uma descrição alargada opcional… editor.signoff_desc=Adicionar "Assinado-por" seguido do autor do cometimento no fim da mensagem do registo de cometimentos. -editor.commit_directly_to_this_branch=Cometer imediatamente no ramo %s. +editor.commit_directly_to_this_branch=Cometer imediatamente no ramo %[1]s. editor.create_new_branch=Crie um novo ramo para este cometimento e inicie um pedido de integração. editor.create_new_branch_np=Criar um novo ramo para este cometimento. editor.propose_file_change=Propor modificação do ficheiro @@ -1724,7 +1724,7 @@ issues.error_modifying_due_date=Falhou a modificação da data de vencimento. issues.error_removing_due_date=Falhou a remoção da data de vencimento. issues.push_commit_1=adicionou %d cometimento %s issues.push_commits_n=adicionou %d cometimentos %s -issues.force_push_codes=`forçou o envio %[1]s de %[2]s para %[4]s %[6]s` +issues.force_push_codes=`forçou o envio %[1]s de %[2]s para %[4]s %[6]s` issues.force_push_compare=Comparar issues.due_date_form=aaaa-mm-dd issues.due_date_form_add=Adicionar data de vencimento @@ -1840,7 +1840,7 @@ pulls.nothing_to_compare_have_tag=O ramo/etiqueta escolhidos são iguais. pulls.nothing_to_compare_and_allow_empty_pr=Estes ramos são iguais. Este pedido de integração ficará vazio. pulls.has_pull_request=`Já existe um pedido de integração entre estes ramos: %[2]s#%[3]d` pulls.create=Criar um pedido de integração -pulls.title_desc_few=quer integrar %[1]d cometimento(s) do ramo %[2]s no ramo %[3]s +pulls.title_desc_few=quer integrar %[1]d cometimento(s) do ramo %[2]s no ramo %[3]s pulls.merged_title_desc_few=integrou %[1]d cometimento(s) do ramo %[2]s no ramo %[3]s %[4]s pulls.change_target_branch_at=`mudou o ramo de destino de %s para %s %s` pulls.tab_conversation=Diálogo @@ -2733,7 +2733,7 @@ migrate.forgejo.description = Migrar dados de codeberg.org ou de outras instânc n_commit_one = %s cometimento editor.commit_id_not_matching = O ficheiro foi modificado enquanto o estava a editar. Cometa para um ramo novo e depois integre. commits.search_branch = Este ramo -pulls.title_desc_one = quer integrar %[1]d cometimento do ramo %[2]s no ramo %[3]s +pulls.title_desc_one = quer integrar %[1]d cometimento do ramo %[2]s no ramo %[3]s pulls.reopen_failed.base_branch = O pedido de integração não pode ser reaberto porque o ramo base já não existe. activity.navbar.code_frequency = Frequência de programação settings.units.add_more = Habilitar mais diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 2324567c45..3507b2ea67 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -934,7 +934,7 @@ select_permissions=Выбрать разрешения permission_no_access=Нет доступа permission_read=Чтение permission_write=Чтение и запись -access_token_desc=Выбранные области действия токена ограничивают авторизацию только соответствующими маршрутами API. Читайте документацию для получения дополнительной информации. +access_token_desc=Выбранные области действия токена ограничивают авторизацию только соответствующими маршрутами API. Читайте документацию для получения дополнительной информации. at_least_one_permission=Необходимо выбрать хотя бы одно разрешение для создания токена permissions_list=Разрешения: @@ -1340,7 +1340,7 @@ editor.fail_to_apply_patch=Невозможно применить патч «%s editor.new_patch=Новая правка editor.commit_message_desc=Добавьте необязательное расширенное описание… editor.signoff_desc=Добавить трейлер Signed-off-by с автором коммита в конце сообщения коммита. -editor.commit_directly_to_this_branch=Сохранить коммит напрямую в ветвь %s. +editor.commit_directly_to_this_branch=Сохранить коммит напрямую в ветвь %[1]s. editor.create_new_branch=Сохранить коммит в новую ветвь и начать запрос на слияние. editor.create_new_branch_np=Создать новую ветвь для этого коммита. editor.propose_file_change=Предложить изменение файла @@ -1705,7 +1705,7 @@ issues.error_modifying_due_date=Не удалось изменить срок в issues.error_removing_due_date=Не удалось убрать срок выполнения. issues.push_commit_1=добавлен %d коммит %s issues.push_commits_n=добавлены %d коммита(ов) %s -issues.force_push_codes=`форсированное обновление изменений %[1]s %[4]s вместо %[2]s %[6]s` +issues.force_push_codes=`форсированное обновление изменений %[1]s %[4]s вместо %[2]s %[6]s` issues.force_push_compare=Сравнить issues.due_date_form=гггг-мм-дд issues.due_date_form_add=Добавить срок выполнения @@ -1816,8 +1816,8 @@ pulls.nothing_to_compare=Нечего сравнивать, родительск pulls.nothing_to_compare_and_allow_empty_pr=Ветви идентичны. Этот PR будет пустым. pulls.has_pull_request=`Запрос на слияние этих ветвей уже существует: %[2]s#%[3]d` pulls.create=Создать запрос на слияние -pulls.title_desc_one=хочет влить %[1]d коммит из %[2]s в %[3]s -pulls.title_desc_few=хочет влить %[1]d коммит(ов) из %[2]s в %[3]s +pulls.title_desc_one=хочет влить %[1]d коммит из %[2]s в %[3]s +pulls.title_desc_few=хочет влить %[1]d коммит(ов) из %[2]s в %[3]s pulls.merged_title_desc_one=слит %[1]d коммит из %[2]s в %[3]s %[4]s pulls.merged_title_desc_few=слито %[1]d коммит(ов) из %[2]s в %[3]s %[4]s pulls.change_target_branch_at=`изменил(а) целевую ветвь с %s на %s %s` diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini index bfb22176e8..d3006c26af 100644 --- a/options/locale/locale_si-LK.ini +++ b/options/locale/locale_si-LK.ini @@ -116,7 +116,6 @@ missing_csrf=නරක ඉල්ලීම: CSRF ටෝකන් නොමැත app_desc=වේදනාකාරී, ස්වයං-සත්කාරක Git සේවාවක් install=ස්ථාපනයට පහසුය platform=හරස් වේදිකාව -platform_desc=Forgejo ඕනෑම තැනක ධාවනය Go සඳහා සම්පාදනය කළ හැකිය: වින්ඩෝස්, මැකෝස්, ලිනක්ස්, ARM, ආදිය ඔබ ආදරය කරන එකක් තෝරන්න! lightweight=සැහැල්ලු lightweight_desc=Forgejo අඩු අවම අවශ්යතා ඇති අතර මිල අඩු Raspberry Pi මත ධාවනය කළ හැකිය. ඔබේ යන්ත්ර ශක්තිය සුරකින්න! license=විවෘත මූලාශ්‍ර @@ -923,7 +922,7 @@ editor.commit_changes=වෙනස්කම් සිදු කරන්න editor.add_tmpl='' එකතු කරන්න editor.commit_message_desc=විකල්ප දීර්ඝ විස්තරයක් එක් කරන්න… editor.signoff_desc=කැපවූ ලොග් පණිවිඩය අවසානයේ දී කැපකරු විසින් සිග්නෙඩ්-ඕෆ්-විසින් ට්රේලරයක් එක් කරන්න. -editor.commit_directly_to_this_branch=%s ශාඛාවට කෙලින්ම කැප කරන්න. +editor.commit_directly_to_this_branch=%[1]s ශාඛාවට කෙලින්ම කැප කරන්න. editor.create_new_branch=මෙම කැප කිරීම සඳහා නව ශාඛාවක් සාදා අදින්න ඉල්ලීමක් ආරම්භ කරන්න. editor.create_new_branch_np=මෙම කැප කිරීම සඳහා නව ශාඛාවක් සාදන්න. editor.propose_file_change=ගොනු වෙනස් කිරීම යෝජනා කරන්න @@ -1098,12 +1097,12 @@ issues.reopen_comment_issue=අදහස් දක්වා විවෘත ක issues.create_comment=අදහස issues.closed_at=`මෙම ගැටළුව වසා %[2]s` issues.reopened_at=`මෙම ගැටළුව නැවත විවෘත කරන ලදි %[2]s` -issues.ref_issue_from=මෙම නිකුතුව %[4]s හි %[2]s -issues.ref_pull_from=මෙම අදින්න ඉල්ලීම%[4]s %[2]s -issues.ref_closing_from=මෙම ගැටළුව වසා දමනු ඇත%[4]s මෙම ගැටළුව %[2]s -issues.ref_reopening_from=මෙම ගැටළුව නැවත විවෘත කරනු ඇත%[4]s මෙම ගැටළුව %[2]s -issues.ref_closed_from=මෙම නිකුතුව%[4]s %[2]s -issues.ref_reopened_from=මෙම නිකුතුව%[4]s %[2]sනැවත විවෘත කරන ලදි +issues.ref_issue_from=`මෙම නිකුතුව %[4]s හි %[2]s` +issues.ref_pull_from=`මෙම අදින්න ඉල්ලීම%[4]s %[2]s` +issues.ref_closing_from=`මෙම ගැටළුව වසා දමනු ඇත%[4]s මෙම ගැටළුව %[2]s` +issues.ref_reopening_from=`මෙම ගැටළුව නැවත විවෘත කරනු ඇත%[4]s මෙම ගැටළුව %[2]s` +issues.ref_closed_from=`මෙම නිකුතුව%[4]s %[2]s` +issues.ref_reopened_from=`මෙම නිකුතුව%[4]s %[2]sනැවත විවෘත කරන ලදි` issues.ref_from=`හිම%[1]s` issues.role.owner=හිමිකරු issues.role.member=සාමාජික @@ -1183,7 +1182,7 @@ issues.error_modifying_due_date=නියමිත දිනය වෙනස් issues.error_removing_due_date=නියමිත දිනය ඉවත් කිරීමට අපොහොසත් විය. issues.push_commit_1=එකතු %d කැප %s issues.push_commits_n=එකතු %d විවරයන් %s -issues.force_push_codes=`බලය-pushed%[1]s සිට %[2]s %[4]s ගේ %[6]s` +issues.force_push_codes=`බලය-pushed%[1]s සිට %[2]s %[4]s ගේ %[6]s` issues.force_push_compare=සසඳන්න issues.due_date_form=Yyy-mm-dd issues.due_date_form_add=නියමිත දිනය එකතු කරන්න @@ -1269,7 +1268,7 @@ pulls.nothing_to_compare=මෙම ශාඛා සමාන වේ. අදි pulls.nothing_to_compare_and_allow_empty_pr=මෙම ශාඛා සමාන වේ. මෙම මහජන සම්බන්ධතා හිස් වනු ඇත. pulls.has_pull_request=`මෙම ශාඛා අතර අදින්න ඉල්ලීම දැනටමත් පවතී: %[2]s #%[3]d` pulls.create=අදින්න ඉල්ලීම නිර්මාණය -pulls.title_desc_few=%[1]d සිට %[2]s දක්වා %[3]s +pulls.title_desc_few=%[1]d සිට %[2]s දක්වා %[3]s pulls.merged_title_desc_few=මර්ජ්%[1]d සිට %[2]s දක්වා %[3]s %[4]s pulls.change_target_branch_at=`ඉලක්කගත ශාඛාව %s සිට %s %sදක්වා වෙනස් කර ඇත` pulls.tab_conversation=සංවාදය @@ -1280,7 +1279,7 @@ pulls.cant_reopen_deleted_branch=ශාඛාව මකා දැමූ නි pulls.merged=සංයුක්ත කෙරිණි pulls.manually_merged=අතින් සංයුක්ත කර ඇත pulls.is_closed=අදින්න ඉල්ලීම වසා දමා ඇත. -pulls.title_wip_desc=අහම්බෙන් ඒකාබද්ධ කිරීමෙන් අදින්න ඉල්ලීම වැළැක්වීම සඳහා %s සමඟ මාතෘකාව ආරම්භ කරන්න. +pulls.title_wip_desc=`අහම්බෙන් ඒකාබද්ධ කිරීමෙන් අදින්න ඉල්ලීම වැළැක්වීම සඳහා %s සමඟ මාතෘකාව ආරම්භ කරන්න.` pulls.cannot_merge_work_in_progress=මෙම අදින්න ඉල්ලීම ක්රියාත්මක වන කාර්යයක් ලෙස සලකුණු කර ඇත. pulls.still_in_progress=තවමත් ක්රියාත්මක වෙමින් තිබේද? pulls.add_prefix=%s උපසර්ගය එකතු කරන්න diff --git a/options/locale/locale_sk-SK.ini b/options/locale/locale_sk-SK.ini index 29824c5b4d..9b7fb5fcd8 100644 --- a/options/locale/locale_sk-SK.ini +++ b/options/locale/locale_sk-SK.ini @@ -187,7 +187,6 @@ app_desc=Jednoducho prístupný vlastný Git install=Jednoduchá inštalácia install_desc=Jednoducho spustite binárku pre vašu platformu, pošlite ju ako Docker, alebo ju získajte ako balíček. platform=Multiplatformový -platform_desc=Forgejo beží všade kde je možné preložiť Go: Windows, macOS, Linux, ARM, a podobne. Vyberte si! lightweight=Ľahká lightweight_desc=Forgejo má minimálne požiadavky a môže bežať na Raspberry Pi. Šetrite energiou vášho stroja! license=Otvorený zdrojový kód @@ -1030,7 +1029,7 @@ editor.cancel_lower=Zrušiť editor.commit_signed_changes=Odoslať podpísané zmeny editor.commit_changes=Odoslať zmeny editor.patch=Použiť patch -editor.commit_directly_to_this_branch=Odoslať zmeny revízie priamo do vetvy %s. +editor.commit_directly_to_this_branch=Odoslať zmeny revízie priamo do vetvy %[1]s. editor.cancel=Zrušiť editor.commit_empty_file_header=Odoslať prázdny súbor editor.commit_empty_file_text=Súbor, ktorý sa chystáte odoslať, je prázdny. Pokračovať? diff --git a/options/locale/locale_sl.ini b/options/locale/locale_sl.ini index 56ef337d83..703a5879ea 100644 --- a/options/locale/locale_sl.ini +++ b/options/locale/locale_sl.ini @@ -312,7 +312,7 @@ appearance = Videz password = Geslo authorized_oauth2_applications_description = Tem aplikacijam tretjih oseb ste odobrili dostop do svojega osebnega računa Forgejo. Prosimo, da prekličete dostop do aplikacij, ki jih ne uporabljate več. social_desc = S temi družabnimi računi se lahko prijavite v svoj račun. Prepričajte se, da jih vse prepoznate. -access_token_desc = Izbrana dovoljenja žetona omejujejo avtorizacijo samo na ustrezne poti API. Za več informacij preberite dokumentacijo. +access_token_desc = Izbrana dovoljenja žetona omejujejo avtorizacijo samo na ustrezne poti API. Za več informacij preberite dokumentacijo. oauth2_client_secret_hint = Skrivnost se ne bo več prikazala, ko zapustite ali osvežite to stran. Prepričajte se, da ste jo shranili. twofa_desc = Za zaščito računa pred krajo gesla lahko uporabite pametni telefon ali drugo napravo za prejemanje časovno omejenih enkratnih gesel ("TOTP"). twofa_recovery_tip = Če napravo izgubite, boste lahko z obnovitvenim ključem za enkratno uporabo ponovno pridobili dostop do računa. diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index e091f91a68..a9c7308f28 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -266,7 +266,7 @@ editor.commit_changes=Изврши комит промена editor.add=Додај '%s' editor.update=Ажурирај '%s' editor.delete=Уклони '%s' -editor.commit_directly_to_this_branch=Изврши комит директно на %s грану. +editor.commit_directly_to_this_branch=Изврши комит директно на %[1]s грану. editor.create_new_branch=Креирај нову грану за овај комит и поднеси захтев за спајање. editor.cancel=Откажи editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште. diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index a96e2cc1dc..4bced1db39 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -850,7 +850,7 @@ editor.commit_signed_changes=Committa signerade ändringar editor.commit_changes=Checka in ändringar editor.add_tmpl=Lägg till '' editor.commit_message_desc=Lägg till en valfri utökad beskrivning… -editor.commit_directly_to_this_branch=Checka in direkt till grenen %s. +editor.commit_directly_to_this_branch=Checka in direkt till grenen %[1]s. editor.create_new_branch=Skapa en ny gren för denna incheckning och påbörja en hämtningsbegäran. editor.create_new_branch_np=Skapa en ny branch för den här committen. editor.propose_file_change=Föreslå filändring @@ -1158,7 +1158,7 @@ pulls.filter_branch=Filtrera gren pulls.no_results=Inga resultat hittades. pulls.nothing_to_compare=Dessa brancher är ekvivalenta. Det finns ingen anledning att skapa en pull-request. pulls.create=Skapa Pullförfrågan -pulls.title_desc_few=vill sammanfoga %[1]d incheckningar från s[2]s in i %[3]s +pulls.title_desc_few=vill sammanfoga %[1]d incheckningar från s[2]s in i %[3]s pulls.merged_title_desc_few=sammanfogade %[1]d incheckningar från %[2]s in i %[3]s %[4]s pulls.change_target_branch_at=`ändrade mål-branch från %s till %s%s` pulls.tab_conversation=Konversation diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index d5fc65e261..87dd127d0c 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -214,7 +214,6 @@ app_desc=Zahmetsiz, kendi sunucunuzda barındırabileceğiniz Git servisi install=Kurulumu kolay install_desc=Platformunuz için ikili dosyayı çalıştırın, Docker ile yükleyin veya paket olarak edinin. platform=Farklı platformlarda çalışablir -platform_desc=Forgejo Go ile derleme yapılabilecek her yerde çalışmaktadır: Windows, macOS, Linux, ARM, vb. Hangisini seviyorsanız onu seçin! lightweight=Hafif lightweight_desc=Forgejo'nın minimal gereksinimleri çok düşüktür ve ucuz bir Raspberry Pi üzerinde çalışabilmektedir. Makine enerjinizden tasarruf edin! license=Açık Kaynak @@ -908,7 +907,7 @@ select_permissions=İzinleri seçin permission_no_access=Erişim Yok permission_read=Okunmuş permission_write=Okuma ve Yazma -access_token_desc=Seçili token izinleri, yetkilendirmeyi ilgili API yollarıyla sınırlandıracaktır. Daha fazla bilgi için belgeleri okuyun. +access_token_desc=Seçili token izinleri, yetkilendirmeyi ilgili API yollarıyla sınırlandıracaktır. Daha fazla bilgi için belgeleri okuyun. at_least_one_permission=Bir token oluşturmak için en azından bir izin seçmelisiniz permissions_list=İzinler: @@ -1318,7 +1317,7 @@ editor.fail_to_apply_patch=`"%s" yaması uygulanamıyor` editor.new_patch=Yeni Yama editor.commit_message_desc=İsteğe bağlı uzun bir açıklama ekleyin… editor.signoff_desc=İşleme günlüğü mesajının sonuna işleyen tarafından imzalanan bir fragman ekleyin. -editor.commit_directly_to_this_branch=Doğrudan %s bölümüne uygula. +editor.commit_directly_to_this_branch=Doğrudan %[1]s bölümüne uygula. editor.create_new_branch=Bu işleme için yeni bir dal oluşturun ve bir değişiklik isteği başlatın. editor.create_new_branch_np=Bu işleme için yeni bir dal oluştur. editor.propose_file_change=Dosya değişikliği öner @@ -1684,7 +1683,7 @@ issues.error_modifying_due_date=Bitiş tarihi değiştirilemedi. issues.error_removing_due_date=Bitiş tarihi silinemedi. issues.push_commit_1=%d işlemeyi %s ekledi issues.push_commits_n=%d işlemeyi %s ekledi -issues.force_push_codes=`%[1]s %[2]s hedefinden %[4]s hedefine zorla gönderildi %[6]s` +issues.force_push_codes=`%[1]s %[2]s hedefinden %[4]s hedefine zorla gönderildi %[6]s` issues.force_push_compare=Karşılaştır issues.due_date_form=yyyy-aa-gg issues.due_date_form_add=Bitiş tarihi ekle @@ -1799,7 +1798,7 @@ pulls.nothing_to_compare=Bu dallar eşit. Değişiklik isteği oluşturmaya gere pulls.nothing_to_compare_and_allow_empty_pr=Bu dallar eşittir. Bu Dİ boş olacak. pulls.has_pull_request=`Bu dallar arasında zaten bir değişiklik isteği var: %[2]s#%[3]d` pulls.create=Değişiklik İsteği Oluştur -pulls.title_desc_few=%[2]s içindeki %[1]d işlemeyi %[3]s ile birleştirmek istiyor +pulls.title_desc_few=%[2]s içindeki %[1]d işlemeyi %[3]s ile birleştirmek istiyor pulls.merged_title_desc_few=%[4]s %[2]s içindeki %[1]d işlemeyi %[3]s ile birleştirdi pulls.change_target_branch_at='hedef dal %s adresinden %s%s adresine değiştirildi' pulls.tab_conversation=Sohbet diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index c75f9b4cde..9a98b4be81 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -1140,7 +1140,7 @@ editor.commit_changes=Закомітити зміни editor.add_tmpl=Додати «» editor.commit_message_desc=Додати необов'язковий розширений опис… editor.signoff_desc=Додати повідомленню в журналі комітів рядок Signed-off-by від свого імені. -editor.commit_directly_to_this_branch=Зробіть коміт прямо в гілку %s. +editor.commit_directly_to_this_branch=Зробіть коміт прямо в гілку %[1]s. editor.create_new_branch=Створити нову гілку для цього коміту та відкрити запит на злиття. editor.create_new_branch_np=Створити нову гілку для цього коміту. editor.propose_file_change=Запропонувати зміну файлу @@ -1411,7 +1411,7 @@ issues.error_modifying_due_date=Не вдалося змінити дату за issues.error_removing_due_date=Не вдалося видалити дату завершення. issues.push_commit_1=додав %d коміт %s issues.push_commits_n=додав %d коміти(-ів) %s -issues.force_push_codes=`примусово залито %[1]s з %[2]s до %[4]s %[6]s` +issues.force_push_codes=`примусово залито %[1]s з %[2]s до %[4]s %[6]s` issues.force_push_compare=Порівняти issues.due_date_form=рррр-мм-дд issues.due_date_form_add=Додати дату завершення @@ -1497,7 +1497,7 @@ pulls.nothing_to_compare=Ці гілки однакові. Немає необх pulls.nothing_to_compare_and_allow_empty_pr=Одинакові гілки. Цей PR буде порожнім. pulls.has_pull_request=`Запит злиття для цих гілок вже існує: %[2]s#%[3]d` pulls.create=Створити запит на злиття -pulls.title_desc_few=хоче злити %[1]d комітів з %[2]s в %[3]s +pulls.title_desc_few=хоче злити %[1]d комітів з %[2]s в %[3]s pulls.merged_title_desc_few=злито %[1]d комітів з %[2]s до %[3]s %[4]s pulls.change_target_branch_at=`змінена цільова гілка з %s на %s %s` pulls.tab_conversation=Обговорення diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 492a43b63b..0f2b99be32 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -935,7 +935,7 @@ select_permissions=选择权限 permission_no_access=无访问权限 permission_read=可读 permission_write=读写 -access_token_desc=所选令牌权限仅限于对应的 API 路由的授权。阅读 文档 以获取更多信息。 +access_token_desc=所选令牌权限仅限于对应的 API 路由的授权。阅读 文档 以获取更多信息。 at_least_one_permission=你需要选择至少一个权限才能创建令牌 permissions_list=权限: @@ -1359,7 +1359,7 @@ editor.fail_to_apply_patch=无法应用补丁 %s editor.new_patch=新补丁 editor.commit_message_desc=添加一个可选的扩展描述… editor.signoff_desc=在提交日志消息末尾添加签署人信息。 -editor.commit_directly_to_this_branch=直接提交至 %s 分支。 +editor.commit_directly_to_this_branch=直接提交至 %[1]s 分支。 editor.create_new_branch=为此提交创建一个 新的分支 并发起合并请求。 editor.create_new_branch_np=为此提交创建 新分支。 editor.propose_file_change=提议文件更改 @@ -1725,7 +1725,7 @@ issues.error_modifying_due_date=修改到期时间失败。 issues.error_removing_due_date=删除到期时间失败。 issues.push_commit_1=于 %[2]s 推送了 %[1]d 个提交 issues.push_commits_n=于 %[2]s 推送了 %[1]d 个提交 -issues.force_push_codes=`于 %[6]s 强制推送 %[1]s,从 %[2]s,至 %[4]s` +issues.force_push_codes=`于 %[6]s 强制推送 %[1]s,从 %[2]s,至 %[4]s` issues.force_push_compare=比较 issues.due_date_form=yyyy-mm-dd issues.due_date_form_add=设置到期时间 @@ -1841,7 +1841,7 @@ pulls.nothing_to_compare_have_tag=所选分支/标签相同。 pulls.nothing_to_compare_and_allow_empty_pr=这些分支是相等的,此合并请求将为空。 pulls.has_pull_request=这些分支之间的合并请求已存在: %[2]s#%[3]d pulls.create=创建合并请求 -pulls.title_desc_few=请求将 %[1]d 次代码提交从 %[2]s 合并至 %[3]s +pulls.title_desc_few=请求将 %[1]d 次代码提交从 %[2]s 合并至 %[3]s pulls.merged_title_desc_few=于 %[4]s 将 %[1]d 次代码提交从 %[2]s合并至 %[3]s pulls.change_target_branch_at=将目标分支从 %s 更改为 %s %s pulls.tab_conversation=对话内容 @@ -2761,7 +2761,7 @@ error.broken_git_hook = 该仓库的 Git 钩子似乎已经损坏,请按照 %[2]s 的 %[1]d 提交合并入 %[3]s %[4]s commits.search_branch = 此分支 open_with_editor = 使用 %s 打开 -pulls.title_desc_one = 想要将来自 %[2]s 的 %[1]d 提交合并到 %[3]s +pulls.title_desc_one = 想要将来自 %[2]s 的 %[1]d 提交合并到 %[3]s settings.rename_branch_failed_protected = 无法重命名受保护的分支 %s。 stars = 点赞 settings.confirmation_string = 确认输入 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index 2558c1d43b..37eaf38270 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -478,7 +478,7 @@ editor.preview_changes=預覽更改 editor.or=或 editor.cancel_lower=取消 editor.commit_changes=提交更改嗎? -editor.commit_directly_to_this_branch=直接提交到 %s 分支。 +editor.commit_directly_to_this_branch=直接提交到 %[1]s 分支。 editor.create_new_branch=建立 新的分支 為此提交和開始合併請求。 editor.cancel=取消 editor.no_changes_to_show=沒有可以顯示的變更。 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 8a333cc49e..90181ba4d0 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -215,7 +215,6 @@ server_internal = 伺服器內部錯誤 app_desc=一套極易架設的 Git 服務 install=安裝容易 platform=跨平台 -platform_desc=Forgejo 可以在所有能編譯 Go 語言的平台上執行:Windows,macOS,Linux,ARM 等。挑一個您喜歡的吧! lightweight=輕量級 lightweight_desc=一片便宜的 Raspberry Pi 就可以滿足 Forgejo 的最低需求。節省您的機器資源! license=開放原始碼 @@ -1027,7 +1026,7 @@ webauthn_key_loss_warning = 如果您弄丟了您的安全金鑰,您將無法 user_unblock_success = 已成功解除對此使用者的封鎖。 webauthn_alternative_tip = 您可能想新增一個額外的驗證方法。 user_block_success = 已成功封鎖此使用者。 -access_token_desc = 選擇的符記僅授權相對應的 API路徑。請參閱文件來了解更多。 +access_token_desc = 選擇的符記僅授權相對應的 API路徑。請參閱文件來了解更多。 oauth2_application_locked = 可以在組態中設定 Forgejo 預先註冊一些 OAuth2 應用程式。為了避免不可預料的情況,它們無法被編輯或是移除。請參閱 OAuth2 文件來了解更多。 hidden_comment_types_description = 在這裡選取的留言種類將不會顯示於問題頁面中。舉例來說,核取「標籤」將隱藏所有「使用者新增/移除了<標籤>」留言。 authorized_oauth2_applications_description = 您已授權給這些第三方應用程式取用您的 Forgejo 個人帳號的權限。請撤銷您不再使用的應用程式的權限。 @@ -1307,7 +1306,7 @@ editor.fail_to_apply_patch=無法套用補綴「%s」 editor.new_patch=新增補綴 editor.commit_message_desc=(選填)加入詳細說明… editor.signoff_desc=在提交訊息底部加入提交者的「Signed-off-by」資訊。 -editor.commit_directly_to_this_branch=直接提交到 %s 分支。 +editor.commit_directly_to_this_branch=直接提交到 %[1]s 分支。 editor.create_new_branch=為此提交建立新分支並提出合併請求。 editor.create_new_branch_np=為本次提交建立新分支。 editor.propose_file_change=提出檔案變更 @@ -1643,7 +1642,7 @@ issues.error_modifying_due_date=無法修改截止日期。 issues.error_removing_due_date=無法移除截止日期。 issues.push_commit_1=加入了 %d 個提交 %s issues.push_commits_n=加入了 %d 個提交 %s -issues.force_push_codes=`強制推送了 %[1]s 自 %[2]s%[4]s %[6]s` +issues.force_push_codes=`強制推送了 %[1]s 自 %[2]s%[4]s %[6]s` issues.force_push_compare=比較 issues.due_date_form=yyyy年mm月dd日 issues.due_date_form_add=新增截止日期 @@ -1745,7 +1744,7 @@ pulls.nothing_to_compare=這些分支的內容相同,無需建立合併請求 pulls.nothing_to_compare_and_allow_empty_pr=這些分支的內容相同,此合併請求將會是空白的。 pulls.has_pull_request=`已有介於這些分支間的合併請求:%[2]s#%[3]d` pulls.create=建立合併請求 -pulls.title_desc_few=請求將 %[1]d 次程式碼提交從 %[2]s 合併至 %[3]s +pulls.title_desc_few=請求將 %[1]d 次程式碼提交從 %[2]s 合併至 %[3]s pulls.merged_title_desc_few=將 %[1]d 次提交從 %[2]s 合併至 %[3]s %[4]s pulls.change_target_branch_at=`將目標分支從 %s 更改為 %s %s` pulls.tab_conversation=對話內容 @@ -2626,7 +2625,7 @@ signing.wont_sign.approved = 因為合併請求沒有被核可,這個合併不 activity.navbar.recent_commits = 最近的提交 issues.comment.blocked_by_user = 因為您被該儲存庫的所有者或問題的提出者封鎖,您不能在這則問題上留言。 pulls.closed = 合併請求已關閉 -pulls.title_desc_one = 想從 %[2]s 合併 %[1]d 個提交至 %[3]s +pulls.title_desc_one = 想從 %[2]s 合併 %[1]d 個提交至 %[3]s pulls.merged_title_desc_one = 於 %[4]s 自 %[2]s 合併了 %[1]d 個提交至 %[3]s issues.archived_label_description = (已封存)%s signing.wont_sign.always = 永遠簽署提交。 diff --git a/templates/repo/editor/commit_form.tmpl b/templates/repo/editor/commit_form.tmpl index 9f81b1d3a0..f8c1beb027 100644 --- a/templates/repo/editor/commit_form.tmpl +++ b/templates/repo/editor/commit_form.tmpl @@ -26,7 +26,7 @@