From a5f2b1480b6ee714b659aaf1f1ac8b4b242b41a5 Mon Sep 17 00:00:00 2001 From: danicc097 Date: Sun, 19 Jan 2025 10:50:23 +0100 Subject: [PATCH 01/14] delete go loop copy vars --- bin/templates/crud-api-tests.go.tmpl.bash | 2 -- bin/templates/crud-repo-tests.go.tmpl.bash | 3 --- bin/templates/crud-service-tests.go.tmpl.bash | 1 - internal/codegen/codegen_test.go | 2 -- internal/repos/postgresql/repo_activity_test.go | 2 -- internal/repos/postgresql/repo_kanban_step_test.go | 2 -- internal/repos/postgresql/repo_project_test.go | 1 - internal/repos/postgresql/repo_team_test.go | 2 -- internal/repos/postgresql/repo_time_entry_test.go | 1 - internal/repos/postgresql/repo_user_test.go | 4 ---- internal/repos/postgresql/repo_work_item_comment_test.go | 3 --- internal/repos/postgresql/repo_work_item_project_demo_test.go | 1 - .../repos/postgresql/repo_work_item_project_demo_two_test.go | 1 - internal/repos/postgresql/repo_work_item_tag_test.go | 1 - internal/repos/postgresql/repo_work_item_type_test.go | 1 - internal/rest/api_user_test.go | 2 -- internal/rest/api_work_item.go | 2 +- internal/rest/api_work_item_comment_test.go | 2 -- internal/rest/api_work_item_tag_test.go | 1 - internal/rest/middleware.auth_test.go | 1 - internal/services/service_user_test.go | 2 -- internal/services/service_work_item_comment_test.go | 1 - internal/services/service_work_item_tag_test.go | 1 - 23 files changed, 1 insertion(+), 38 deletions(-) diff --git a/bin/templates/crud-api-tests.go.tmpl.bash b/bin/templates/crud-api-tests.go.tmpl.bash index 028b608f9..82290a8bf 100644 --- a/bin/templates/crud-api-tests.go.tmpl.bash +++ b/bin/templates/crud-api-tests.go.tmpl.bash @@ -56,7 +56,6 @@ $(test -n "$with_project" && echo " pj := models.ProjectNameDemo }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() ufixture := ff.CreateUser(context.Background(), servicetestutil.CreateUserParams{ @@ -217,7 +216,6 @@ done) // }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/bin/templates/crud-repo-tests.go.tmpl.bash b/bin/templates/crud-repo-tests.go.tmpl.bash index cc82db409..85279fbca 100644 --- a/bin/templates/crud-repo-tests.go.tmpl.bash +++ b/bin/templates/crud-repo-tests.go.tmpl.bash @@ -58,7 +58,6 @@ $(test -n "$with_project" && echo " projectID := internal.ProjectIDByName[models }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -112,7 +111,6 @@ func Test${pascal_name}_${delete_method}(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -154,7 +152,6 @@ func Test${pascal_name}_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } } diff --git a/bin/templates/crud-service-tests.go.tmpl.bash b/bin/templates/crud-service-tests.go.tmpl.bash index 01b254ca9..8eabc056e 100644 --- a/bin/templates/crud-service-tests.go.tmpl.bash +++ b/bin/templates/crud-service-tests.go.tmpl.bash @@ -82,7 +82,6 @@ done) } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/codegen/codegen_test.go b/internal/codegen/codegen_test.go index 7498c96a2..06499f22a 100644 --- a/internal/codegen/codegen_test.go +++ b/internal/codegen/codegen_test.go @@ -54,7 +54,6 @@ func TestAnalyzeSpec(t *testing.T) { } for _, tc := range cases { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -222,7 +221,6 @@ func (h *StrictHandlers) Bar() { // }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/repos/postgresql/repo_activity_test.go b/internal/repos/postgresql/repo_activity_test.go index 010c7d16a..6685deae6 100644 --- a/internal/repos/postgresql/repo_activity_test.go +++ b/internal/repos/postgresql/repo_activity_test.go @@ -53,7 +53,6 @@ func TestActivity_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } @@ -68,7 +67,6 @@ func TestActivity_ByIndexedQueries(t *testing.T) { }, } for _, tc := range nonUniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } } diff --git a/internal/repos/postgresql/repo_kanban_step_test.go b/internal/repos/postgresql/repo_kanban_step_test.go index 4b60aaaf9..1ecfe698b 100644 --- a/internal/repos/postgresql/repo_kanban_step_test.go +++ b/internal/repos/postgresql/repo_kanban_step_test.go @@ -26,7 +26,6 @@ func TestKanbanStep_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } @@ -50,7 +49,6 @@ func TestKanbanStep_ByIndexedQueries(t *testing.T) { }, } for _, tc := range nonUniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } } diff --git a/internal/repos/postgresql/repo_project_test.go b/internal/repos/postgresql/repo_project_test.go index 08b0e3636..976d095bc 100644 --- a/internal/repos/postgresql/repo_project_test.go +++ b/internal/repos/postgresql/repo_project_test.go @@ -39,7 +39,6 @@ func TestProject_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } } diff --git a/internal/repos/postgresql/repo_team_test.go b/internal/repos/postgresql/repo_team_test.go index ed6bcead5..2667fe4a7 100644 --- a/internal/repos/postgresql/repo_team_test.go +++ b/internal/repos/postgresql/repo_team_test.go @@ -49,7 +49,6 @@ func TestTeam_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } } @@ -122,7 +121,6 @@ func TestTriggers_sync_user_teams(t *testing.T) { }, } for _, tc := range testCases { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/repos/postgresql/repo_time_entry_test.go b/internal/repos/postgresql/repo_time_entry_test.go index e68156066..09cee520d 100644 --- a/internal/repos/postgresql/repo_time_entry_test.go +++ b/internal/repos/postgresql/repo_time_entry_test.go @@ -34,7 +34,6 @@ func TestTimeEntry_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } diff --git a/internal/repos/postgresql/repo_user_test.go b/internal/repos/postgresql/repo_user_test.go index f9462a1a5..fc1f7f1a2 100644 --- a/internal/repos/postgresql/repo_user_test.go +++ b/internal/repos/postgresql/repo_user_test.go @@ -52,7 +52,6 @@ func TestUser_Update(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -109,7 +108,6 @@ func TestUser_SoftDelete(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -192,7 +190,6 @@ func TestUser_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } @@ -227,7 +224,6 @@ func TestUser_ByIndexedQueries(t *testing.T) { }, } for _, tc := range nonUniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } } diff --git a/internal/repos/postgresql/repo_work_item_comment_test.go b/internal/repos/postgresql/repo_work_item_comment_test.go index a903b00bc..34e3de7ec 100644 --- a/internal/repos/postgresql/repo_work_item_comment_test.go +++ b/internal/repos/postgresql/repo_work_item_comment_test.go @@ -48,7 +48,6 @@ func TestWorkItemComment_Update(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -101,7 +100,6 @@ func TestWorkItemComment_Delete(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -141,7 +139,6 @@ func TestWorkItemComment_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } } diff --git a/internal/repos/postgresql/repo_work_item_project_demo_test.go b/internal/repos/postgresql/repo_work_item_project_demo_test.go index 5412ba344..fa15f2a3a 100644 --- a/internal/repos/postgresql/repo_work_item_project_demo_test.go +++ b/internal/repos/postgresql/repo_work_item_project_demo_test.go @@ -46,7 +46,6 @@ func TestDemoWorkItem_Update(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/repos/postgresql/repo_work_item_project_demo_two_test.go b/internal/repos/postgresql/repo_work_item_project_demo_two_test.go index 38d0d365e..098f2fa47 100644 --- a/internal/repos/postgresql/repo_work_item_project_demo_two_test.go +++ b/internal/repos/postgresql/repo_work_item_project_demo_two_test.go @@ -49,7 +49,6 @@ func TestDemoTwoWorkItem_Update(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/repos/postgresql/repo_work_item_tag_test.go b/internal/repos/postgresql/repo_work_item_tag_test.go index 02c2a8992..42f1bd7d8 100644 --- a/internal/repos/postgresql/repo_work_item_tag_test.go +++ b/internal/repos/postgresql/repo_work_item_tag_test.go @@ -37,7 +37,6 @@ func TestWorkItemTag_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } } diff --git a/internal/repos/postgresql/repo_work_item_type_test.go b/internal/repos/postgresql/repo_work_item_type_test.go index cac0aa21c..66e378049 100644 --- a/internal/repos/postgresql/repo_work_item_type_test.go +++ b/internal/repos/postgresql/repo_work_item_type_test.go @@ -37,7 +37,6 @@ func TestWorkItemType_ByIndexedQueries(t *testing.T) { }, } for _, tc := range uniqueTestCases { - tc := tc runGenericFilterTests(t, tc) } } diff --git a/internal/rest/api_user_test.go b/internal/rest/api_user_test.go index e18d6c101..9e47913db 100644 --- a/internal/rest/api_user_test.go +++ b/internal/rest/api_user_test.go @@ -51,7 +51,6 @@ func TestHandlers_DeleteUser(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() ufixture := ff.CreateUser(context.Background(), servicetestutil.CreateUserParams{ @@ -233,7 +232,6 @@ func TestHandlers_UpdateUser(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/rest/api_work_item.go b/internal/rest/api_work_item.go index 6d8040c20..267c07595 100644 --- a/internal/rest/api_work_item.go +++ b/internal/rest/api_work_item.go @@ -98,7 +98,7 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe var resJson *CreateWorkitem201JSONResponse json.Unmarshal(rawMessage(res), &resJson) - return *resJson, nil + return resJson, nil } func (h *StrictHandlers) GetWorkItem(c *gin.Context, request GetWorkItemRequestObject) (GetWorkItemResponseObject, error) { diff --git a/internal/rest/api_work_item_comment_test.go b/internal/rest/api_work_item_comment_test.go index 5d7864135..da7f34cba 100644 --- a/internal/rest/api_work_item_comment_test.go +++ b/internal/rest/api_work_item_comment_test.go @@ -46,7 +46,6 @@ func TestHandlers_DeleteWorkItemComment(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -205,7 +204,6 @@ func TestHandlers_UpdateWorkItemComment(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/rest/api_work_item_tag_test.go b/internal/rest/api_work_item_tag_test.go index a662e0f00..9dbcca844 100644 --- a/internal/rest/api_work_item_tag_test.go +++ b/internal/rest/api_work_item_tag_test.go @@ -42,7 +42,6 @@ func TestHandlers_CreateWorkItemTag(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/rest/middleware.auth_test.go b/internal/rest/middleware.auth_test.go index 38372c34a..881faf718 100644 --- a/internal/rest/middleware.auth_test.go +++ b/internal/rest/middleware.auth_test.go @@ -95,7 +95,6 @@ func TestAuthorizationMiddleware(t *testing.T) { svcs := services.New(logger, services.CreateTestRepos(t), testPool) for _, tc := range testCases { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() res := httptest.NewRecorder() diff --git a/internal/services/service_user_test.go b/internal/services/service_user_test.go index 3a3ac2a70..ccae4cbc0 100644 --- a/internal/services/service_user_test.go +++ b/internal/services/service_user_test.go @@ -87,7 +87,6 @@ func TestUser_UpdateUser(t *testing.T) { } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() @@ -286,7 +285,6 @@ func TestUser_UpdateUserAuthorization(t *testing.T) { } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/services/service_work_item_comment_test.go b/internal/services/service_work_item_comment_test.go index cbe914aef..85a840e4f 100644 --- a/internal/services/service_work_item_comment_test.go +++ b/internal/services/service_work_item_comment_test.go @@ -54,7 +54,6 @@ func TestWorkItemComment_Update(t *testing.T) { }, } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/internal/services/service_work_item_tag_test.go b/internal/services/service_work_item_tag_test.go index 33083afe4..d306bdf34 100644 --- a/internal/services/service_work_item_tag_test.go +++ b/internal/services/service_work_item_tag_test.go @@ -90,7 +90,6 @@ func TestWorkItemTag_Update(t *testing.T) { } for _, tc := range tests { - tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() From c488de4ca8a09ec44d56d6ea62c2ca1a3a9fcd4b Mon Sep 17 00:00:00 2001 From: danicc097 Date: Sun, 19 Jan 2025 12:18:54 +0100 Subject: [PATCH 02/14] discriminator and mapping updates --- bin/project | 9 ++++++-- internal/rest/api_work_item.go | 36 +++++++++++++++++++++---------- internal/rest/discriminator.go | 20 +++++++++++++++++ internal/rest/service_mappings.go | 19 ++++++++++++++++ 4 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 internal/rest/discriminator.go create mode 100644 internal/rest/service_mappings.go diff --git a/bin/project b/bin/project index b91f8f7ab..9170f8771 100755 --- a/bin/project +++ b/bin/project @@ -1250,14 +1250,19 @@ x.lint.go() { # golangci-lint run --config=.golangci.yml --allow-parallel-runners --fast --fix &>/dev/null || true } -exhaustruct_lint() { +exhaustive_lint() { local lint_config=$( cat < Date: Sun, 19 Jan 2025 13:17:57 +0100 Subject: [PATCH 03/14] handler panic for rendering --- bin/templates/crud-api.go.tmpl.bash | 8 - .../oapi-templates/strict/strict-gin.tmpl | 10 + internal/rest/api_activity.go | 8 - internal/rest/api_notifications.go | 2 - internal/rest/api_oidc.go | 3 - internal/rest/api_team.go | 8 - internal/rest/api_user.go | 14 - internal/rest/api_work_item.go | 12 - internal/rest/api_work_item_comment.go | 8 - internal/rest/api_work_item_tag.go | 2 - internal/rest/middleware.auth.go | 12 +- internal/rest/middleware.db.go | 2 +- internal/rest/middleware.openapi.go | 6 +- internal/rest/openapi_server.gen.go | 470 ++++++++++++++++++ internal/rest/responses.go | 33 +- 15 files changed, 522 insertions(+), 76 deletions(-) diff --git a/bin/templates/crud-api.go.tmpl.bash b/bin/templates/crud-api.go.tmpl.bash index f257485f5..21286a828 100644 --- a/bin/templates/crud-api.go.tmpl.bash +++ b/bin/templates/crud-api.go.tmpl.bash @@ -18,8 +18,6 @@ $(test -n "$with_project" && echo " params.ProjectID = internal.ProjectIDByName[ ${camel_name}, err := h.svc.${pascal_name}.Create(c, tx, ¶ms) if err != nil { renderErrorResponse(c, "Could not create ${sentence_name}", err) - - return nil, nil } res := ${pascal_name}Response{ @@ -36,8 +34,6 @@ func (h *StrictHandlers) Get${pascal_name}(c *gin.Context, request Get${pascal_n ${camel_name}, err := h.svc.${pascal_name}.ByID(c, tx, request.${pascal_name}ID) if err != nil { renderErrorResponse(c, "Could not create ${sentence_name}", err) - - return nil, nil } res := ${pascal_name}Response{ @@ -56,8 +52,6 @@ func (h *StrictHandlers) Update${pascal_name}(c *gin.Context, request Update${pa ${camel_name}, err := h.svc.${pascal_name}.Update(c, tx, request.${pascal_name}ID, ¶ms) if err != nil { renderErrorResponse(c, "Could not update ${sentence_name}", err) - - return nil, nil } res := ${pascal_name}Response{ @@ -74,8 +68,6 @@ func (h *StrictHandlers) Delete${pascal_name}(c *gin.Context, request Delete${pa _, err := h.svc.${pascal_name}.Delete(c, tx, request.${pascal_name}ID) if err != nil { renderErrorResponse(c, "Could not delete ${sentence_name}", err) - - return nil, nil } return Delete${pascal_name}204Response{}, nil diff --git a/cmd/oapi-codegen/oapi-templates/strict/strict-gin.tmpl b/cmd/oapi-codegen/oapi-templates/strict/strict-gin.tmpl index b33028d51..7bce2314f 100644 --- a/cmd/oapi-codegen/oapi-templates/strict/strict-gin.tmpl +++ b/cmd/oapi-codegen/oapi-templates/strict/strict-gin.tmpl @@ -22,6 +22,16 @@ func (sh *strictHandlers) authMiddlewares(opID OperationID) []gin.HandlerFunc { {{$opid := .OperationId}} // {{$opid}} operation middleware func (sh *strictHandlers) {{.OperationId}}(ctx *gin.Context{{genParamArgs .PathParams}}{{if .RequiresParamObject}}, params externalRef0.{{.OperationId}}Params{{end}}) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request {{$opid | ucFirst}}RequestObject {{range .PathParams -}} diff --git a/internal/rest/api_activity.go b/internal/rest/api_activity.go index f2af1af1a..3a92331d3 100644 --- a/internal/rest/api_activity.go +++ b/internal/rest/api_activity.go @@ -8,8 +8,6 @@ func (h *StrictHandlers) CreateActivity(c *gin.Context, request CreateActivityRe activity, err := h.svc.Activity.Create(c.Request.Context(), h.pool, request.ProjectName, &request.Body.ActivityCreateParams) if err != nil { renderErrorResponse(c, "could not create activity", err) - - return nil, nil } return CreateActivity201JSONResponse{Activity: *activity}, nil @@ -18,8 +16,6 @@ func (h *StrictHandlers) CreateActivity(c *gin.Context, request CreateActivityRe func (h *StrictHandlers) DeleteActivity(c *gin.Context, request DeleteActivityRequestObject) (DeleteActivityResponseObject, error) { if _, err := h.svc.Activity.Delete(c.Request.Context(), h.pool, request.ActivityID); err != nil { renderErrorResponse(c, "could not delete activity", err) - - return nil, nil } return DeleteActivity204Response{}, nil @@ -29,8 +25,6 @@ func (h *StrictHandlers) GetActivity(c *gin.Context, request GetActivityRequestO activity, err := h.svc.Activity.ByID(c.Request.Context(), h.pool, request.ActivityID) if err != nil { renderErrorResponse(c, "could not get activity", err) - - return nil, nil } return GetActivity200JSONResponse{Activity: *activity}, nil @@ -40,8 +34,6 @@ func (h *StrictHandlers) UpdateActivity(c *gin.Context, request UpdateActivityRe activity, err := h.svc.Activity.Update(c.Request.Context(), h.pool, request.ActivityID, &request.Body.ActivityUpdateParams) if err != nil { renderErrorResponse(c, "could not update activity", err) - - return nil, nil } return UpdateActivity200JSONResponse{Activity: *activity}, nil diff --git a/internal/rest/api_notifications.go b/internal/rest/api_notifications.go index 4af2e568f..79084901c 100644 --- a/internal/rest/api_notifications.go +++ b/internal/rest/api_notifications.go @@ -12,8 +12,6 @@ func (h *StrictHandlers) GetPaginatedNotifications(c *gin.Context, request GetPa nn, err := h.svc.Notification.PaginatedUserNotifications(c.Request.Context(), h.pool, caller.UserID, request.Params) if err != nil { renderErrorResponse(c, "Could not fetch notifications", err) - - return nil, nil } nextCursor := "" diff --git a/internal/rest/api_oidc.go b/internal/rest/api_oidc.go index 0cdde87c1..9559e09de 100644 --- a/internal/rest/api_oidc.go +++ b/internal/rest/api_oidc.go @@ -53,7 +53,6 @@ func (h *StrictHandlers) MyProviderCallback(c *gin.Context, request MyProviderCa userinfo, err := GetUserInfoFromCtx(c) if err != nil { renderErrorResponse(c, "OIDC authentication error", internal.WrapErrorf(err, models.ErrorCodeOIDC, "user info not found")) - return nil, nil } ctx := c.Request.Context() @@ -61,13 +60,11 @@ func (h *StrictHandlers) MyProviderCallback(c *gin.Context, request MyProviderCa u, err := h.svc.Authentication.GetOrRegisterUserFromUserInfo(ctx, *userinfo) if err != nil { renderErrorResponse(c, "OIDC authentication error", internal.WrapErrorf(err, models.ErrorCodeOIDC, "could not get or register user")) - return nil, nil } accessToken, err := h.svc.Authentication.CreateAccessTokenForUser(ctx, u) if err != nil { renderErrorResponse(c, "OIDC authentication error", internal.WrapErrorf(err, models.ErrorCodeOIDC, "could not create access token")) - return nil, nil } http.SetCookie(c.Writer, &http.Cookie{ diff --git a/internal/rest/api_team.go b/internal/rest/api_team.go index e7b38aeca..e02cc9377 100644 --- a/internal/rest/api_team.go +++ b/internal/rest/api_team.go @@ -18,8 +18,6 @@ func (h *StrictHandlers) CreateTeam(c *gin.Context, request CreateTeamRequestObj team, err := h.svc.Team.Create(ctx, tx, ¶ms) if err != nil { renderErrorResponse(c, "Could not create team", err) - - return nil, nil } h.event.Queue(ctx, fmt.Sprintf("team created: %v", team.TeamID), models.TopicTeamCreated) @@ -36,8 +34,6 @@ func (h *StrictHandlers) UpdateTeam(c *gin.Context, request UpdateTeamRequestObj team, err := h.svc.Team.Update(ctx, tx, models.TeamID(request.TeamID), ¶ms) if err != nil { renderErrorResponse(c, "Could not update team", err) - - return nil, nil } return UpdateTeam200JSONResponse{Team: *team}, nil @@ -50,8 +46,6 @@ func (h *StrictHandlers) GetTeam(c *gin.Context, request GetTeamRequestObject) ( team, err := h.svc.Team.ByID(ctx, tx, models.TeamID(request.TeamID)) if err != nil { renderErrorResponse(c, "Could not get team", err) - - return nil, nil } return GetTeam200JSONResponse{Team: *team}, nil @@ -64,8 +58,6 @@ func (h *StrictHandlers) DeleteTeam(c *gin.Context, request DeleteTeamRequestObj _, err := h.svc.Team.Delete(ctx, tx, models.TeamID(request.TeamID)) if err != nil { renderErrorResponse(c, "Could not delete team", err) - - return nil, nil } return DeleteTeam204Response{}, nil diff --git a/internal/rest/api_user.go b/internal/rest/api_user.go index 2fe3ba622..13653e36b 100644 --- a/internal/rest/api_user.go +++ b/internal/rest/api_user.go @@ -21,15 +21,11 @@ func (h *StrictHandlers) UpdateUser(c *gin.Context, request UpdateUserRequestObj user, err := h.svc.User.Update(c, tx, models.UserID{UUID: request.Id}, caller, request.Body) if err != nil { renderErrorResponse(c, "Could not update user", err) - - return nil, nil } role, ok := h.svc.Authorization.RoleByRank(user.RoleRank) if !ok { renderErrorResponse(c, fmt.Sprintf("Role with rank %d not found", user.RoleRank), nil) - - return nil, nil } res := UserResponse{User: user, Role: role.Name} @@ -43,8 +39,6 @@ func (h *StrictHandlers) DeleteUser(c *gin.Context, request DeleteUserRequestObj _, err := h.svc.User.Delete(c, tx, models.NewUserID(request.Id)) if err != nil { renderErrorResponse(c, "Could not delete user", err) - - return nil, nil } return DeleteUser204Response{}, nil @@ -57,8 +51,6 @@ func (h *StrictHandlers) GetCurrentUser(c *gin.Context, request GetCurrentUserRe if !ok { msg := fmt.Sprintf("role with rank %d not found", caller.RoleRank) renderErrorResponse(c, msg, errors.New(msg)) - - return nil, nil } res := UserResponse{ @@ -82,8 +74,6 @@ func (h *StrictHandlers) UpdateUserAuthorization(c *gin.Context, request UpdateU if _, err := h.svc.User.UpdateUserAuthorization(c, tx, models.UserID{UUID: request.Id}, caller, request.Body); err != nil { renderErrorResponse(c, "Error updating user authorization", err) - - return nil, nil } return UpdateUserAuthorization204Response{}, nil @@ -93,8 +83,6 @@ func (h *StrictHandlers) GetPaginatedUsers(c *gin.Context, request GetPaginatedU users, err := h.svc.User.Paginated(c, h.pool, request.Params) if err != nil { renderErrorResponse(c, "Could not update user", err) - - return nil, nil } nextCursor := "" @@ -103,8 +91,6 @@ func (h *StrictHandlers) GetPaginatedUsers(c *gin.Context, request GetPaginatedU nextCursor, err = getNextCursor(lastUser, request.Params.Column, models.TableEntityUser) if err != nil { renderErrorResponse(c, "Could not define next cursor", err) - - return nil, nil } } items := make([]UserResponse, len(users)) diff --git a/internal/rest/api_work_item.go b/internal/rest/api_work_item.go index e776b9755..06e2c62c7 100644 --- a/internal/rest/api_work_item.go +++ b/internal/rest/api_work_item.go @@ -37,8 +37,6 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe jsonBody, err := io.ReadAll(c.Request.Body) if err != nil { renderErrorResponse(c, "Failed to read request body", err) - - return nil, nil } span.SetAttributes(tracing.MetadataAttribute(jsonBody)) c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonBody)) @@ -46,16 +44,12 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe project, err := projectByDiscriminator(request.Body) if err != nil { renderErrorResponse(c, "Failed to get project", err) - - return nil, nil } var res any // depends on project b, err := request.Body.ValueByDiscriminator() if err != nil { renderErrorResponse(c, "Failed to read discriminator", err) - - return nil, nil } //exhaustive:enforce @@ -74,8 +68,6 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe }) if err != nil { renderErrorResponse(c, "Could not create work item", err) - - return nil, nil } res = DemoWorkItemResponse{ @@ -96,8 +88,6 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe }) if err != nil { renderErrorResponse(c, "Could not create work item", err) - - return nil, nil } res = DemoTwoWorkItemResponse{ @@ -106,8 +96,6 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe } default: renderErrorResponse(c, "Unknown discriminator", internal.NewErrorf(models.ErrorCodeUnknown, "%+v", b)) - - return nil, nil } var resJson *CreateWorkitem201JSONResponse diff --git a/internal/rest/api_work_item_comment.go b/internal/rest/api_work_item_comment.go index 2619021e1..ddf0d40fb 100644 --- a/internal/rest/api_work_item_comment.go +++ b/internal/rest/api_work_item_comment.go @@ -13,8 +13,6 @@ func (h *StrictHandlers) CreateWorkItemComment(c *gin.Context, request CreateWor workItemComment, err := h.svc.WorkItemComment.Create(c, tx, ¶ms) if err != nil { renderErrorResponse(c, "Could not create work item comment", err) - - return nil, nil } res := WorkItemCommentResponse{ @@ -31,8 +29,6 @@ func (h *StrictHandlers) GetWorkItemComment(c *gin.Context, request GetWorkItemC workItemComment, err := h.svc.WorkItemComment.ByID(c, tx, request.WorkItemCommentID) if err != nil { renderErrorResponse(c, "Could not create work item comment", err) - - return nil, nil } res := WorkItemCommentResponse{ @@ -52,8 +48,6 @@ func (h *StrictHandlers) UpdateWorkItemComment(c *gin.Context, request UpdateWor workItemComment, err := h.svc.WorkItemComment.Update(c, tx, caller, models.WorkItemCommentID(request.WorkItemCommentID), ¶ms) if err != nil { renderErrorResponse(c, "Could not update work item comment", err) - - return nil, nil } res := WorkItemCommentResponse{ @@ -71,8 +65,6 @@ func (h *StrictHandlers) DeleteWorkItemComment(c *gin.Context, request DeleteWor _, err := h.svc.WorkItemComment.Delete(c, tx, caller, models.WorkItemCommentID(request.WorkItemCommentID)) if err != nil { renderErrorResponse(c, "Could not delete work item comment", err) - - return nil, nil } return DeleteWorkItemComment204Response{}, nil diff --git a/internal/rest/api_work_item_tag.go b/internal/rest/api_work_item_tag.go index b69b509e6..28e3caa02 100644 --- a/internal/rest/api_work_item_tag.go +++ b/internal/rest/api_work_item_tag.go @@ -18,8 +18,6 @@ func (h *StrictHandlers) CreateWorkItemTag(c *gin.Context, request CreateWorkIte wit, err := h.svc.WorkItemTag.Create(ctx, tx, caller, &body.WorkItemTagCreateParams) if err != nil { renderErrorResponse(c, "Could not create work item tag", err) - - return nil, nil } return CreateWorkItemTag201JSONResponse{WorkItemTag: *wit}, nil diff --git a/internal/rest/middleware.auth.go b/internal/rest/middleware.auth.go index b2fcc33c6..e9ab2c800 100644 --- a/internal/rest/middleware.auth.go +++ b/internal/rest/middleware.auth.go @@ -45,7 +45,7 @@ func (m *authMiddleware) EnsureAuthenticated() gin.HandlerFunc { if apiKey != "" { u, err := m.svc.Authentication.GetUserFromAPIKey(c.Request.Context(), apiKey) // includes caller joins if err != nil || u == nil { - renderErrorResponse(c, "Unauthenticated", internal.NewErrorf(models.ErrorCodeUnauthenticated, "could not get user from api key")) + renderErrorResponse(c, "Unauthenticated", internal.NewErrorf(models.ErrorCodeUnauthenticated, "could not get user from api key"), WithoutPanic()) c.Abort() return @@ -60,7 +60,7 @@ func (m *authMiddleware) EnsureAuthenticated() gin.HandlerFunc { if strings.HasPrefix(auth, "Bearer ") { u, err := m.svc.Authentication.GetUserFromAccessToken(c.Request.Context(), strings.Split(auth, "Bearer ")[1]) // includes caller joins if err != nil || u == nil { - renderErrorResponse(c, "Unauthenticated", internal.NewErrorf(models.ErrorCodeUnauthenticated, "could not get user from token: %s", err)) + renderErrorResponse(c, "Unauthenticated", internal.NewErrorf(models.ErrorCodeUnauthenticated, "could not get user from token: %s", err), WithoutPanic()) c.Abort() return @@ -73,7 +73,7 @@ func (m *authMiddleware) EnsureAuthenticated() gin.HandlerFunc { return } - renderErrorResponse(c, "Unauthenticated", internal.NewErrorf(models.ErrorCodeUnauthenticated, "could not get user from token")) + renderErrorResponse(c, "Unauthenticated", internal.NewErrorf(models.ErrorCodeUnauthenticated, "could not get user from token"), WithoutPanic()) c.Abort() } } @@ -91,7 +91,7 @@ func (m *authMiddleware) EnsureAuthorized(config AuthRestriction) gin.HandlerFun errs := []string{} user, err := GetUserCallerFromCtx(c) if err != nil { - renderErrorResponse(c, "Could not get current user.", nil) + renderErrorResponse(c, "Could not get current user.", nil, WithoutPanic()) c.Abort() return @@ -100,7 +100,7 @@ func (m *authMiddleware) EnsureAuthorized(config AuthRestriction) gin.HandlerFun if config.MinimumRole != "" { userRole, ok := m.svc.Authorization.RoleByRank(user.RoleRank) if !ok { - renderErrorResponse(c, fmt.Sprintf("Unknown rank value: %d", user.RoleRank), errors.New("unknown rank")) + renderErrorResponse(c, fmt.Sprintf("Unknown rank value: %d", user.RoleRank), errors.New("unknown rank"), WithoutPanic()) c.Abort() return @@ -129,7 +129,7 @@ func (m *authMiddleware) EnsureAuthorized(config AuthRestriction) gin.HandlerFun errorMsg = fmt.Sprintf("either %s are required", slices.Join(errs, " or ")) } - renderErrorResponse(c, "Unauthorized", internal.NewErrorf(models.ErrorCodeUnauthorized, "unauthorized: "+errorMsg)) + renderErrorResponse(c, "Unauthorized", internal.NewErrorf(models.ErrorCodeUnauthorized, "unauthorized: "+errorMsg), WithoutPanic()) c.Abort() } } diff --git a/internal/rest/middleware.db.go b/internal/rest/middleware.db.go index 201e5f401..1b3fddcad 100644 --- a/internal/rest/middleware.db.go +++ b/internal/rest/middleware.db.go @@ -32,7 +32,7 @@ func (m *dbMiddleware) BeginTransaction() gin.HandlerFunc { tx, err := m.pool.BeginTx(ctx, pgx.TxOptions{}) if err != nil { - renderErrorResponse(c, "", internal.WrapErrorf(err, models.ErrorCodePrivate, "could not begin transaction")) + renderErrorResponse(c, "", internal.WrapErrorf(err, models.ErrorCodePrivate, "could not begin transaction"), WithoutPanic()) c.Abort() return diff --git a/internal/rest/middleware.openapi.go b/internal/rest/middleware.openapi.go index a767320d6..8fd2d0a10 100644 --- a/internal/rest/middleware.openapi.go +++ b/internal/rest/middleware.openapi.go @@ -82,7 +82,7 @@ func (m *openapiMiddleware) RequestValidatorWithOptions(options *OAValidatorOpti options.ErrorHandler(c, err.Error(), http.StatusBadRequest) } else { // error response customized via WithCustomSchemaErrorFunc - renderErrorResponse(c, "Invalid request", internal.WrapErrorf(err, models.ErrorCodeRequestValidation, "OpenAPI request validation failed")) + renderErrorResponse(c, "Invalid request", internal.WrapErrorf(err, models.ErrorCodeRequestValidation, "OpenAPI request validation failed"), WithoutPanic()) } rbw.ResponseWriter.Write(rbw.body.Bytes()) @@ -102,7 +102,7 @@ func (m *openapiMiddleware) RequestValidatorWithOptions(options *OAValidatorOpti rvi, err := buildRequestValidationInput(m.router, c.Request, &options.Options) if err != nil { // error response customized via WithCustomSchemaErrorFunc - renderErrorResponse(c, fmt.Sprintf("openapi request validation input: %v", err), err) + renderErrorResponse(c, fmt.Sprintf("openapi request validation input: %v", err), err, WithoutPanic()) rbw.ResponseWriter.Write(rbw.body.Bytes()) return @@ -120,7 +120,7 @@ func (m *openapiMiddleware) RequestValidatorWithOptions(options *OAValidatorOpti if err := openapi3filter.ValidateResponse(c.Request.Context(), input); err != nil { rbw.body.Reset() - renderErrorResponse(c, "Invalid response", internal.WrapErrorf(err, models.ErrorCodeResponseValidation, "OpenAPI response validation failed")) + renderErrorResponse(c, "Invalid response", internal.WrapErrorf(err, models.ErrorCodeResponseValidation, "OpenAPI response validation failed"), WithoutPanic()) rbw.ResponseWriter.Write(rbw.body.Bytes()) return diff --git a/internal/rest/openapi_server.gen.go b/internal/rest/openapi_server.gen.go index f08fa1fa6..7c1c70df9 100644 --- a/internal/rest/openapi_server.gen.go +++ b/internal/rest/openapi_server.gen.go @@ -3318,6 +3318,16 @@ func (sh *strictHandlers) authMiddlewares(opID OperationID) []gin.HandlerFunc { // DeleteActivity operation middleware func (sh *strictHandlers) DeleteActivity(ctx *gin.Context, activityID models.ActivityID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request DeleteActivityRequestObject request.ActivityID = activityID @@ -3345,6 +3355,16 @@ func (sh *strictHandlers) DeleteActivity(ctx *gin.Context, activityID models.Act // GetActivity operation middleware func (sh *strictHandlers) GetActivity(ctx *gin.Context, activityID models.ActivityID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetActivityRequestObject request.ActivityID = activityID @@ -3372,6 +3392,16 @@ func (sh *strictHandlers) GetActivity(ctx *gin.Context, activityID models.Activi // UpdateActivity operation middleware func (sh *strictHandlers) UpdateActivity(ctx *gin.Context, activityID models.ActivityID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateActivityRequestObject request.ActivityID = activityID @@ -3408,6 +3438,16 @@ func (sh *strictHandlers) UpdateActivity(ctx *gin.Context, activityID models.Act // AdminPing operation middleware func (sh *strictHandlers) AdminPing(ctx *gin.Context) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request AdminPingRequestObject handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { @@ -3433,6 +3473,16 @@ func (sh *strictHandlers) AdminPing(ctx *gin.Context) { // MyProviderCallback operation middleware func (sh *strictHandlers) MyProviderCallback(ctx *gin.Context) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request MyProviderCallbackRequestObject handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { @@ -3458,6 +3508,16 @@ func (sh *strictHandlers) MyProviderCallback(ctx *gin.Context) { // MyProviderLogin operation middleware func (sh *strictHandlers) MyProviderLogin(ctx *gin.Context, params externalRef0.MyProviderLoginParams) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request MyProviderLoginRequestObject request.Params = params @@ -3485,6 +3545,16 @@ func (sh *strictHandlers) MyProviderLogin(ctx *gin.Context, params externalRef0. // Events operation middleware func (sh *strictHandlers) Events(ctx *gin.Context, params externalRef0.EventsParams) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request EventsRequestObject request.Params = params @@ -3512,6 +3582,16 @@ func (sh *strictHandlers) Events(ctx *gin.Context, params externalRef0.EventsPar // GetPaginatedNotifications operation middleware func (sh *strictHandlers) GetPaginatedNotifications(ctx *gin.Context, params externalRef0.GetPaginatedNotificationsParams) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetPaginatedNotificationsRequestObject request.Params = params @@ -3539,6 +3619,16 @@ func (sh *strictHandlers) GetPaginatedNotifications(ctx *gin.Context, params ext // OpenapiYamlGet operation middleware func (sh *strictHandlers) OpenapiYamlGet(ctx *gin.Context) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request OpenapiYamlGetRequestObject handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { @@ -3564,6 +3654,16 @@ func (sh *strictHandlers) OpenapiYamlGet(ctx *gin.Context) { // Ping operation middleware func (sh *strictHandlers) Ping(ctx *gin.Context) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request PingRequestObject handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { @@ -3589,6 +3689,16 @@ func (sh *strictHandlers) Ping(ctx *gin.Context) { // GetProject operation middleware func (sh *strictHandlers) GetProject(ctx *gin.Context, projectName externalRef0.ProjectName) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetProjectRequestObject request.ProjectName = projectName @@ -3616,6 +3726,16 @@ func (sh *strictHandlers) GetProject(ctx *gin.Context, projectName externalRef0. // CreateActivity operation middleware func (sh *strictHandlers) CreateActivity(ctx *gin.Context, projectName externalRef0.ProjectName) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request CreateActivityRequestObject request.ProjectName = projectName @@ -3652,6 +3772,16 @@ func (sh *strictHandlers) CreateActivity(ctx *gin.Context, projectName externalR // GetProjectBoard operation middleware func (sh *strictHandlers) GetProjectBoard(ctx *gin.Context, projectName externalRef0.ProjectName) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetProjectBoardRequestObject request.ProjectName = projectName @@ -3679,6 +3809,16 @@ func (sh *strictHandlers) GetProjectBoard(ctx *gin.Context, projectName external // GetProjectConfig operation middleware func (sh *strictHandlers) GetProjectConfig(ctx *gin.Context, projectName externalRef0.ProjectName) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetProjectConfigRequestObject request.ProjectName = projectName @@ -3706,6 +3846,16 @@ func (sh *strictHandlers) GetProjectConfig(ctx *gin.Context, projectName externa // UpdateProjectConfig operation middleware func (sh *strictHandlers) UpdateProjectConfig(ctx *gin.Context, projectName externalRef0.ProjectName) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateProjectConfigRequestObject request.ProjectName = projectName @@ -3742,6 +3892,16 @@ func (sh *strictHandlers) UpdateProjectConfig(ctx *gin.Context, projectName exte // InitializeProject operation middleware func (sh *strictHandlers) InitializeProject(ctx *gin.Context, projectName externalRef0.ProjectName) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request InitializeProjectRequestObject request.ProjectName = projectName @@ -3778,6 +3938,16 @@ func (sh *strictHandlers) InitializeProject(ctx *gin.Context, projectName extern // CreateTeam operation middleware func (sh *strictHandlers) CreateTeam(ctx *gin.Context, projectName externalRef0.ProjectName) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request CreateTeamRequestObject request.ProjectName = projectName @@ -3814,6 +3984,16 @@ func (sh *strictHandlers) CreateTeam(ctx *gin.Context, projectName externalRef0. // CreateWorkItemTag operation middleware func (sh *strictHandlers) CreateWorkItemTag(ctx *gin.Context, projectName externalRef0.ProjectName) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request CreateWorkItemTagRequestObject request.ProjectName = projectName @@ -3850,6 +4030,16 @@ func (sh *strictHandlers) CreateWorkItemTag(ctx *gin.Context, projectName extern // CreateWorkItemType operation middleware func (sh *strictHandlers) CreateWorkItemType(ctx *gin.Context, projectName externalRef0.ProjectName) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request CreateWorkItemTypeRequestObject request.ProjectName = projectName @@ -3886,6 +4076,16 @@ func (sh *strictHandlers) CreateWorkItemType(ctx *gin.Context, projectName exter // GetProjectWorkitems operation middleware func (sh *strictHandlers) GetProjectWorkitems(ctx *gin.Context, projectName externalRef0.ProjectName, params externalRef0.GetProjectWorkitemsParams) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetProjectWorkitemsRequestObject request.ProjectName = projectName @@ -3914,6 +4114,16 @@ func (sh *strictHandlers) GetProjectWorkitems(ctx *gin.Context, projectName exte // DeleteTeam operation middleware func (sh *strictHandlers) DeleteTeam(ctx *gin.Context, teamID models.TeamID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request DeleteTeamRequestObject request.TeamID = teamID @@ -3941,6 +4151,16 @@ func (sh *strictHandlers) DeleteTeam(ctx *gin.Context, teamID models.TeamID) { // GetTeam operation middleware func (sh *strictHandlers) GetTeam(ctx *gin.Context, teamID models.TeamID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetTeamRequestObject request.TeamID = teamID @@ -3968,6 +4188,16 @@ func (sh *strictHandlers) GetTeam(ctx *gin.Context, teamID models.TeamID) { // UpdateTeam operation middleware func (sh *strictHandlers) UpdateTeam(ctx *gin.Context, teamID models.TeamID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateTeamRequestObject request.TeamID = teamID @@ -4004,6 +4234,16 @@ func (sh *strictHandlers) UpdateTeam(ctx *gin.Context, teamID models.TeamID) { // CreateTimeEntry operation middleware func (sh *strictHandlers) CreateTimeEntry(ctx *gin.Context) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request CreateTimeEntryRequestObject // CreateTimeEntryRequest @@ -4038,6 +4278,16 @@ func (sh *strictHandlers) CreateTimeEntry(ctx *gin.Context) { // DeleteTimeEntry operation middleware func (sh *strictHandlers) DeleteTimeEntry(ctx *gin.Context, timeEntryID models.TimeEntryID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request DeleteTimeEntryRequestObject request.TimeEntryID = timeEntryID @@ -4065,6 +4315,16 @@ func (sh *strictHandlers) DeleteTimeEntry(ctx *gin.Context, timeEntryID models.T // GetTimeEntry operation middleware func (sh *strictHandlers) GetTimeEntry(ctx *gin.Context, timeEntryID models.TimeEntryID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetTimeEntryRequestObject request.TimeEntryID = timeEntryID @@ -4092,6 +4352,16 @@ func (sh *strictHandlers) GetTimeEntry(ctx *gin.Context, timeEntryID models.Time // UpdateTimeEntry operation middleware func (sh *strictHandlers) UpdateTimeEntry(ctx *gin.Context, timeEntryID models.TimeEntryID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateTimeEntryRequestObject request.TimeEntryID = timeEntryID @@ -4128,6 +4398,16 @@ func (sh *strictHandlers) UpdateTimeEntry(ctx *gin.Context, timeEntryID models.T // GetCurrentUser operation middleware func (sh *strictHandlers) GetCurrentUser(ctx *gin.Context) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetCurrentUserRequestObject handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { @@ -4153,6 +4433,16 @@ func (sh *strictHandlers) GetCurrentUser(ctx *gin.Context) { // GetPaginatedUsers operation middleware func (sh *strictHandlers) GetPaginatedUsers(ctx *gin.Context, params externalRef0.GetPaginatedUsersParams) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetPaginatedUsersRequestObject request.Params = params @@ -4180,6 +4470,16 @@ func (sh *strictHandlers) GetPaginatedUsers(ctx *gin.Context, params externalRef // DeleteUser operation middleware func (sh *strictHandlers) DeleteUser(ctx *gin.Context, id uuid.UUID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request DeleteUserRequestObject request.Id = id @@ -4207,6 +4507,16 @@ func (sh *strictHandlers) DeleteUser(ctx *gin.Context, id uuid.UUID) { // UpdateUser operation middleware func (sh *strictHandlers) UpdateUser(ctx *gin.Context, id uuid.UUID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateUserRequestObject request.Id = id @@ -4243,6 +4553,16 @@ func (sh *strictHandlers) UpdateUser(ctx *gin.Context, id uuid.UUID) { // UpdateUserAuthorization operation middleware func (sh *strictHandlers) UpdateUserAuthorization(ctx *gin.Context, id uuid.UUID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateUserAuthorizationRequestObject request.Id = id @@ -4279,6 +4599,16 @@ func (sh *strictHandlers) UpdateUserAuthorization(ctx *gin.Context, id uuid.UUID // DeleteWorkItemTag operation middleware func (sh *strictHandlers) DeleteWorkItemTag(ctx *gin.Context, workItemTagID models.WorkItemTagID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request DeleteWorkItemTagRequestObject request.WorkItemTagID = workItemTagID @@ -4306,6 +4636,16 @@ func (sh *strictHandlers) DeleteWorkItemTag(ctx *gin.Context, workItemTagID mode // GetWorkItemTag operation middleware func (sh *strictHandlers) GetWorkItemTag(ctx *gin.Context, workItemTagID models.WorkItemTagID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetWorkItemTagRequestObject request.WorkItemTagID = workItemTagID @@ -4333,6 +4673,16 @@ func (sh *strictHandlers) GetWorkItemTag(ctx *gin.Context, workItemTagID models. // UpdateWorkItemTag operation middleware func (sh *strictHandlers) UpdateWorkItemTag(ctx *gin.Context, workItemTagID models.WorkItemTagID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateWorkItemTagRequestObject request.WorkItemTagID = workItemTagID @@ -4369,6 +4719,16 @@ func (sh *strictHandlers) UpdateWorkItemTag(ctx *gin.Context, workItemTagID mode // DeleteWorkItemType operation middleware func (sh *strictHandlers) DeleteWorkItemType(ctx *gin.Context, workItemTypeID models.WorkItemTypeID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request DeleteWorkItemTypeRequestObject request.WorkItemTypeID = workItemTypeID @@ -4396,6 +4756,16 @@ func (sh *strictHandlers) DeleteWorkItemType(ctx *gin.Context, workItemTypeID mo // GetWorkItemType operation middleware func (sh *strictHandlers) GetWorkItemType(ctx *gin.Context, workItemTypeID models.WorkItemTypeID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetWorkItemTypeRequestObject request.WorkItemTypeID = workItemTypeID @@ -4423,6 +4793,16 @@ func (sh *strictHandlers) GetWorkItemType(ctx *gin.Context, workItemTypeID model // UpdateWorkItemType operation middleware func (sh *strictHandlers) UpdateWorkItemType(ctx *gin.Context, workItemTypeID models.WorkItemTypeID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateWorkItemTypeRequestObject request.WorkItemTypeID = workItemTypeID @@ -4459,6 +4839,16 @@ func (sh *strictHandlers) UpdateWorkItemType(ctx *gin.Context, workItemTypeID mo // CreateWorkitem operation middleware func (sh *strictHandlers) CreateWorkitem(ctx *gin.Context) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request CreateWorkitemRequestObject // CreateWorkitemRequest @@ -4493,6 +4883,16 @@ func (sh *strictHandlers) CreateWorkitem(ctx *gin.Context) { // GetPaginatedWorkItem operation middleware func (sh *strictHandlers) GetPaginatedWorkItem(ctx *gin.Context, params externalRef0.GetPaginatedWorkItemParams) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetPaginatedWorkItemRequestObject request.Params = params @@ -4520,6 +4920,16 @@ func (sh *strictHandlers) GetPaginatedWorkItem(ctx *gin.Context, params external // DeleteWorkitem operation middleware func (sh *strictHandlers) DeleteWorkitem(ctx *gin.Context, workItemID models.WorkItemID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request DeleteWorkitemRequestObject request.WorkItemID = workItemID @@ -4547,6 +4957,16 @@ func (sh *strictHandlers) DeleteWorkitem(ctx *gin.Context, workItemID models.Wor // GetWorkItem operation middleware func (sh *strictHandlers) GetWorkItem(ctx *gin.Context, workItemID models.WorkItemID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetWorkItemRequestObject request.WorkItemID = workItemID @@ -4574,6 +4994,16 @@ func (sh *strictHandlers) GetWorkItem(ctx *gin.Context, workItemID models.WorkIt // UpdateWorkitem operation middleware func (sh *strictHandlers) UpdateWorkitem(ctx *gin.Context, workItemID models.WorkItemID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateWorkitemRequestObject request.WorkItemID = workItemID @@ -4601,6 +5031,16 @@ func (sh *strictHandlers) UpdateWorkitem(ctx *gin.Context, workItemID models.Wor // CreateWorkItemComment operation middleware func (sh *strictHandlers) CreateWorkItemComment(ctx *gin.Context, workItemID int) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request CreateWorkItemCommentRequestObject request.WorkItemID = workItemID @@ -4637,6 +5077,16 @@ func (sh *strictHandlers) CreateWorkItemComment(ctx *gin.Context, workItemID int // DeleteWorkItemComment operation middleware func (sh *strictHandlers) DeleteWorkItemComment(ctx *gin.Context, workItemID models.WorkItemID, workItemCommentID models.WorkItemCommentID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request DeleteWorkItemCommentRequestObject request.WorkItemID = workItemID @@ -4665,6 +5115,16 @@ func (sh *strictHandlers) DeleteWorkItemComment(ctx *gin.Context, workItemID mod // GetWorkItemComment operation middleware func (sh *strictHandlers) GetWorkItemComment(ctx *gin.Context, workItemID models.WorkItemID, workItemCommentID models.WorkItemCommentID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request GetWorkItemCommentRequestObject request.WorkItemID = workItemID @@ -4693,6 +5153,16 @@ func (sh *strictHandlers) GetWorkItemComment(ctx *gin.Context, workItemID models // UpdateWorkItemComment operation middleware func (sh *strictHandlers) UpdateWorkItemComment(ctx *gin.Context, workItemID models.WorkItemID, workItemCommentID models.WorkItemCommentID) { + defer func() { + if r := recover(); r != nil { + // handler() may panic to notify early handler exit + if _, ok := r.(*HandlerExitError); !ok { + panic(r) + } + // swallow panic, assume error response was rendered already to gin context + } + }() + var request UpdateWorkItemCommentRequestObject request.WorkItemID = workItemID diff --git a/internal/rest/responses.go b/internal/rest/responses.go index c8e16958b..4af5a39a2 100644 --- a/internal/rest/responses.go +++ b/internal/rest/responses.go @@ -17,10 +17,35 @@ import ( "go.opentelemetry.io/otel/trace" ) +// HandlerExitError is used to exit handlers early after rendering an error response. +type HandlerExitError struct{} + +func (e *HandlerExitError) Error() string { + return "handler exit requested" +} + +type RenderErrorOptions struct { + WithoutPanic bool +} + +type RenderErrorOption func(*RenderErrorOptions) + +// WithoutPanic prevents renderErrorResponse from panicking with a HandlerExitError. +func WithoutPanic() RenderErrorOption { + return func(o *RenderErrorOptions) { + o.WithoutPanic = true + } +} + // renderErrorResponse writes an error response from title and error. // title represents an error title which will be shown to end users. // Inspired by https://www.rfc-editor.org/rfc/rfc7807. -func renderErrorResponse(c *gin.Context, title string, err error) { +func renderErrorResponse(c *gin.Context, title string, err error, opts ...RenderErrorOption) { + options := RenderErrorOptions{} + for _, opt := range opts { + opt(&options) + } + if err == nil { err = errors.New("unknown error") } @@ -126,6 +151,12 @@ func renderErrorResponse(c *gin.Context, title string, err error) { CtxWithRequestError(c) renderResponse(c, resp, resp.Status) + + // will trigger handler exit only for convenience in handlers and their utility functions. + // it then recovers and executes subsequent middlewares. + if !options.WithoutPanic { + panic(&HandlerExitError{}) + } } func extractValidationError(err error) *models.HTTPValidationError { From e060d20d4088c47099cb42da40b1df7ae4f1de7d Mon Sep 17 00:00:00 2001 From: danicc097 Date: Sun, 19 Jan 2025 13:43:40 +0100 Subject: [PATCH 04/14] utility handler fn extraction --- internal/rest/api_work_item.go | 23 +++-------------------- internal/rest/discriminator.go | 17 +++++++++++------ internal/rest/otel.go | 14 ++++++++++++++ internal/rest/responses.go | 3 +++ 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/internal/rest/api_work_item.go b/internal/rest/api_work_item.go index 06e2c62c7..d6a1b52cc 100644 --- a/internal/rest/api_work_item.go +++ b/internal/rest/api_work_item.go @@ -1,16 +1,13 @@ package rest import ( - "bytes" "encoding/json" - "io" "net/http" "github.com/danicc097/openapi-go-gin-postgres-sqlc/internal" "github.com/danicc097/openapi-go-gin-postgres-sqlc/internal/repos" "github.com/danicc097/openapi-go-gin-postgres-sqlc/internal/repos/postgresql/gen/models" "github.com/danicc097/openapi-go-gin-postgres-sqlc/internal/services" - "github.com/danicc097/openapi-go-gin-postgres-sqlc/internal/tracing" "github.com/gin-gonic/gin" ) @@ -29,28 +26,14 @@ func (h *StrictHandlers) DeleteWorkitem(c *gin.Context, request DeleteWorkitemRe func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRequestObject) (CreateWorkitemResponseObject, error) { ctx := c.Request.Context() - span := GetSpanFromCtx(c) - caller, _ := GetUserCallerFromCtx(c) tx := GetTxFromCtx(c) - jsonBody, err := io.ReadAll(c.Request.Body) - if err != nil { - renderErrorResponse(c, "Failed to read request body", err) - } - span.SetAttributes(tracing.MetadataAttribute(jsonBody)) - c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonBody)) - - project, err := projectByDiscriminator(request.Body) - if err != nil { - renderErrorResponse(c, "Failed to get project", err) - } + addRequestBodyToSpan(c) var res any // depends on project - b, err := request.Body.ValueByDiscriminator() - if err != nil { - renderErrorResponse(c, "Failed to read discriminator", err) - } + + project, b := projectAndBodyByDiscriminator(c, request.Body) //exhaustive:enforce switch project { diff --git a/internal/rest/discriminator.go b/internal/rest/discriminator.go index d53f2af56..35954c27a 100644 --- a/internal/rest/discriminator.go +++ b/internal/rest/discriminator.go @@ -1,20 +1,25 @@ package rest import ( - "fmt" - "github.com/danicc097/openapi-go-gin-postgres-sqlc/internal/repos/postgresql/gen/models" + "github.com/gin-gonic/gin" ) type PolymorphicBody interface { Discriminator() (string, error) + ValueByDiscriminator() (interface{}, error) } -func projectByDiscriminator(b PolymorphicBody) (models.ProjectName, error) { - d, err := b.Discriminator() +func projectAndBodyByDiscriminator(c *gin.Context, body PolymorphicBody) (models.ProjectName, interface{}) { + d, err := body.Discriminator() + if err != nil { + renderErrorResponse(c, "could not get project discriminator: %w", err) + } + + b, err := body.ValueByDiscriminator() if err != nil { - return "", fmt.Errorf("could not get project discriminator: %w", err) + renderErrorResponse(c, "could not convert body: %w", err) } - return models.ProjectName(d), nil + return models.ProjectName(d), b } diff --git a/internal/rest/otel.go b/internal/rest/otel.go index cbc43bc82..d1c16495b 100644 --- a/internal/rest/otel.go +++ b/internal/rest/otel.go @@ -1,6 +1,9 @@ package rest import ( + "bytes" + "io" + "github.com/danicc097/openapi-go-gin-postgres-sqlc/internal" "github.com/danicc097/openapi-go-gin-postgres-sqlc/internal/tracing" "github.com/gin-gonic/gin" @@ -38,3 +41,14 @@ func newOTelSpanWithUser(c *gin.Context, opts ...trace.SpanStartOption) trace.Sp return builder.Build(c.Request.Context()) } + +func addRequestBodyToSpan(c *gin.Context) { + span := GetSpanFromCtx(c) + + jsonBody, err := io.ReadAll(c.Request.Body) + if err != nil { + renderErrorResponse(c, "Failed to read request body", err) + } + span.SetAttributes(tracing.MetadataAttribute(jsonBody)) + c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonBody)) +} diff --git a/internal/rest/responses.go b/internal/rest/responses.go index 4af5a39a2..aa61755db 100644 --- a/internal/rest/responses.go +++ b/internal/rest/responses.go @@ -38,6 +38,9 @@ func WithoutPanic() RenderErrorOption { } // renderErrorResponse writes an error response from title and error. +// When used inside a StrictHandlers' handler, it panics with a HandlerExitError which +// is recovered immediately by the handler wrapper. +// When used outside a StrictHandlers' handler, WithoutPanic must be used to prevent unrecovered panics. // title represents an error title which will be shown to end users. // Inspired by https://www.rfc-editor.org/rfc/rfc7807. func renderErrorResponse(c *gin.Context, title string, err error, opts ...RenderErrorOption) { From f1832ff842958bf24b9f3e21c39498512f33f5d0 Mon Sep 17 00:00:00 2001 From: danicc097 Date: Sat, 25 Jan 2025 10:07:36 +0100 Subject: [PATCH 05/14] extension grouping --- db/migrations/0000001_audit.up.sql | 18 --------- ...it.down.sql => 0000001_extension.down.sql} | 0 db/migrations/0000001_extension.up.sql | 38 +++++++++++++++++++ db/migrations/0000002_init.up.sql | 23 +++-------- 4 files changed, 44 insertions(+), 35 deletions(-) delete mode 100644 db/migrations/0000001_audit.up.sql rename db/migrations/{0000001_audit.down.sql => 0000001_extension.down.sql} (100%) create mode 100644 db/migrations/0000001_extension.up.sql diff --git a/db/migrations/0000001_audit.up.sql b/db/migrations/0000001_audit.up.sql deleted file mode 100644 index e3555a6b9..000000000 --- a/db/migrations/0000001_audit.up.sql +++ /dev/null @@ -1,18 +0,0 @@ -create schema if not exists extensions; - --- make sure everybody can use everything in the extensions schema -grant usage on schema extensions to public; - -grant execute on all functions in schema extensions to public; - --- include future extensions -alter default privileges in schema extensions grant execute on functions to public; - -alter default privileges in schema extensions grant usage on types to public; - -create extension if not exists plpgsql_check schema extensions; - -create extension if not exists "uuid-ossp" schema extensions; - --- https://github.com/supabase/supa_audit -create extension if not exists supa_audit schema extensions; diff --git a/db/migrations/0000001_audit.down.sql b/db/migrations/0000001_extension.down.sql similarity index 100% rename from db/migrations/0000001_audit.down.sql rename to db/migrations/0000001_extension.down.sql diff --git a/db/migrations/0000001_extension.up.sql b/db/migrations/0000001_extension.up.sql new file mode 100644 index 000000000..f3e72bbb3 --- /dev/null +++ b/db/migrations/0000001_extension.up.sql @@ -0,0 +1,38 @@ +create schema if not exists extensions; + +-- make sure everybody can use everything in the extensions schema +grant usage on schema extensions to public; + +grant execute on all functions in schema extensions to public; + +-- include future extensions +alter default privileges in schema extensions grant execute on functions to public; + +alter default privileges in schema extensions grant usage on types to public; + +create extension if not exists plpgsql_check schema extensions; + +create extension if not exists "uuid-ossp" schema extensions; + +-- https://github.com/supabase/supa_audit +-- not available in supabase itself, rather pgaudit +do $$ +begin + create extension if not exists supa_audit schema extensions; +exception + when others then + raise notice 'supa_audit extension not available'; +end +$$; + +create extension if not exists pg_stat_statements schema extensions; + +create extension if not exists hypopg schema extensions; + +create extension if not exists index_advisor schema extensions; + +create extension if not exists pg_trgm schema extensions; + +create extension if not exists btree_gin schema extensions; + +create extension if not exists rum schema extensions; diff --git a/db/migrations/0000002_init.up.sql b/db/migrations/0000002_init.up.sql index ebfe6f725..385bd3188 100644 --- a/db/migrations/0000002_init.up.sql +++ b/db/migrations/0000002_init.up.sql @@ -3,18 +3,6 @@ create schema if not exists v; create schema if not exists "cache"; -create extension if not exists pg_stat_statements schema extensions; - -create extension if not exists hypopg schema extensions; - -create extension if not exists index_advisor schema extensions; - -create extension if not exists pg_trgm schema extensions; - -create extension if not exists btree_gin schema extensions; - -create extension if not exists rum schema extensions; - -- alter database postgres_test set timezone to 'America/New_York'; create or replace function jsonb_set_deep (target jsonb , path text[] , val jsonb) returns jsonb @@ -846,18 +834,19 @@ create trigger sync_user_projects -- -- audit -- +/* select - audit.enable_tracking ('public.kanban_steps'); + audit.enable_tracking ('public.kanban_steps'); select - audit.enable_tracking ('public.projects'); + audit.enable_tracking ('public.projects'); select - audit.enable_tracking ('public.teams'); + audit.enable_tracking ('public.teams'); select - audit.enable_tracking ('public.work_items'); - + audit.enable_tracking ('public.work_items'); + */ ---- create or replace function project_exists (project_name text) returns boolean From d49aa6ee96b7ef536458f2f70f2fd37e2a3fdfe9 Mon Sep 17 00:00:00 2001 From: Daniel Castro Date: Sat, 25 Jan 2025 15:00:51 +0100 Subject: [PATCH 06/14] update golangcilint --- .golangci.yml | 12 ++++++------ bin/project | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 39186cf39..d28bcda66 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,9 +1,6 @@ # https://github.com/MarioCarrion/todo-api-microservice-example/blob/main/.golangci.yml -run: - skip-files: # ignore yaml error... - - ".*\\.xo\\.go$" - - ".*\\.gen\\.go$" - - ".*\\.pb\\.go$" +# yaml-language-server: $schema=https://raw.githubusercontent.com/golangci/golangci-lint/refs/tags/v1.63.4/jsonschema/golangci.jsonschema.json + linters: enable-all: true disable: @@ -65,7 +62,6 @@ linters-settings: json: goCamel yaml: goCamel staticcheck: - go: "1.22" checks: - "all" gci: @@ -117,6 +113,10 @@ linters-settings: ignorePackageGlobs: - github.com/danicc097/openapi-go-gin-postgres-sqlc/* issues: + exclude-files: + - ".*\\.xo\\.go$" + - ".*\\.gen\\.go$" + - ".*\\.pb\\.go$" exclude-rules: - path: "internal/testutil/*" # doesn't work with internal/... for some reason linters: diff --git a/bin/project b/bin/project index 9170f8771..be71f1cd5 100755 --- a/bin/project +++ b/bin/project @@ -285,7 +285,7 @@ x.install-tools() { commands=( "go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@v4.15.2" "go install github.com/sqlc-dev/sqlc/cmd/sqlc@v1.24.0" - "go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.2" + "go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.63.4" "go install github.com/tufin/oasdiff@v1.10.9" "go install golang.org/x/tools/cmd/goimports@latest" "go install mvdan.cc/gofumpt@latest" From 284b3d84bb53fb36a53567187590177c1a22609c Mon Sep 17 00:00:00 2001 From: danicc097 Date: Fri, 7 Feb 2025 23:00:58 +0100 Subject: [PATCH 07/14] update styles --- frontend/src/utils/form.module.css | 7 +++ frontend/src/utils/formGeneration.tsx | 76 +++++++++++++-------------- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/frontend/src/utils/form.module.css b/frontend/src/utils/form.module.css index 4af642269..bdbe50c93 100644 --- a/frontend/src/utils/form.module.css +++ b/frontend/src/utils/form.module.css @@ -5,6 +5,13 @@ padding: 2px; padding-left: var(--mantine-spacing-xs); border-radius: var(--mantine-radius-sm); + + background-color: var(--bg-color); + color: var(--text-color); + + button { + color: var(--text-color); + } } .valueComponentInnerBox { diff --git a/frontend/src/utils/formGeneration.tsx b/frontend/src/utils/formGeneration.tsx index 49c0cc4b3..97f73c3e3 100644 --- a/frontend/src/utils/formGeneration.tsx +++ b/frontend/src/utils/formGeneration.tsx @@ -1,6 +1,4 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ -import { css } from '@emotion/react' -import type { EmotionJSX, ReactJSXElement } from '@emotion/react/types/jsx-namespace' import { Group, TextInput, @@ -38,6 +36,7 @@ import { InputBaseProps, List, } from '@mantine/core' +import cx from 'clsx' import classes from './form.module.css' import { DateInput, DateTimePicker } from '@mantine/dates' import { useFocusWithin } from '@mantine/hooks' @@ -77,7 +76,6 @@ import { type UseFormSetError, } from 'react-hook-form' import { json } from 'react-router-dom' -import { ApiError } from 'src/api/mutator' import DynamicFormErrorCallout from 'src/components/Callout/DynamicFormErrorCallout' import PageTemplate from 'src/components/PageTemplate' import useRenders from 'src/hooks/utils/useRenders' @@ -332,9 +330,9 @@ export default function DynamicForm
@@ -362,9 +360,9 @@ type GeneratedInputsProps = { } const containerProps = { - css: css` - width: 100%; - `, + style: { + width: '100%', + }, } function GeneratedInputs({ parentSchemaKey, parentFormField }: GeneratedInputsProps) { @@ -391,9 +389,9 @@ function GeneratedInputs({ parentSchemaKey, parentFormField }: GeneratedInputsPr const itemName = singularize(options.labels[schemaKey] || '') const inputProps = { - css: css` - width: 100%; - `, + style: { + minWidth: '100%', + }, ...(!field.isArray && { label: options.labels[schemaKey] }), required: field.required, 'data-testid': `${formName}-${formField}`, @@ -418,9 +416,9 @@ function GeneratedInputs({ parentSchemaKey, parentFormField }: GeneratedInputsPr mt={12} mb={12} withBorder - css={css` - width: 100%; - `} + style={{ + minWidth: '100%', + }} > {/* existing array fields, if any */} { @@ -466,9 +464,9 @@ function GeneratedInputs({ parentSchemaKey, parentFormField }: GeneratedInputsPr {field.type !== 'object' ? ( <> @@ -584,9 +582,9 @@ const ArrayOfObjectsChild = ({ index, formField, itemName, schemaKey }) => { return (
@@ -618,9 +616,9 @@ function ArrayChildren({ formField, schemaKey, inputProps }: ArrayChildrenProps) if (options.selectOptions?.[schemaKey]?.type === 'multiselect') { return ( {children} @@ -745,10 +743,10 @@ const GeneratedInput = ({ schemaKey, props, formField, index }: GeneratedInputPr ? // TODO: use convertValueByType { valueAsDate: true, setValueAs: (v) => (v === '' ? undefined : new Date(v)) } : type === 'integer' - ? { valueAsNumber: true, setValueAs: (v) => (v === '' ? undefined : parseInt(v, 10)) } - : type === 'number' - ? { valueAsNumber: true, setValueAs: (v) => (v === '' ? undefined : parseFloat(v)) } - : null), + ? { valueAsNumber: true, setValueAs: (v) => (v === '' ? undefined : parseInt(v, 10)) } + : type === 'number' + ? { valueAsNumber: true, setValueAs: (v) => (v === '' ? undefined : parseFloat(v)) } + : null), }) const fieldState = form.getFieldState(formField) @@ -1490,12 +1488,10 @@ function CustomPill({ return ( {invalidValue || transformer(option)} From 918849f62085ce9ecfc1f80046b94e6eedd087d9 Mon Sep 17 00:00:00 2001 From: danicc097 Date: Fri, 7 Feb 2025 23:02:51 +0100 Subject: [PATCH 08/14] remove e2e ci --- .github/workflows/tests.yaml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 636e32af4..2ee39cc84 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -89,15 +89,6 @@ jobs: project e2e.run - - uses: actions/upload-artifact@v3 - if: always() - with: - name: playwright-report - path: e2e/playwright-report/ - retention-days: 5 - # TODO: reuse actions/setup: - # https://stackoverflow.com/questions/65242830/in-a-github-actions-workflow-is-there-a-way-to-have-multiple-jobs-reuse-the-sam - # https://github.com/kmadof/github-actions-manual/blob/main/.github/actions/say-hello/action.yml - name: Build frontend run: | From ac2d02a41df72f267d40193e02dab7d864e1cfe8 Mon Sep 17 00:00:00 2001 From: Daniel Castro Date: Sun, 9 Mar 2025 17:40:57 +0100 Subject: [PATCH 09/14] correct path for local pnpm --- .envrc | 1 + frontend/pnpm-lock.yaml | 402 ++++++++++++++++++---------------------- 2 files changed, 181 insertions(+), 222 deletions(-) diff --git a/.envrc b/.envrc index 7c4dce170..31aa5fc9b 100644 --- a/.envrc +++ b/.envrc @@ -2,6 +2,7 @@ # prepending export GOBIN=$PWD/bin/tools +export GOBIN=$PWD/bin/tools/bin export PATH=$GOBIN:$PATH export PATH=$GOBIN/bin:$PATH export PATH=$PWD/bin:$PATH diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 4933d7fb5..d057faec3 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 11.11.3(@types/react@18.0.26)(react@18.2.0) '@emotion/styled': specifier: ^11.10.5 - version: 11.10.5(@babel/core@7.20.2)(@emotion/react@11.11.3(@types/react@18.0.26)(react@18.2.0))(@types/react@18.0.26)(react@18.2.0) + version: 11.10.5(@babel/core@7.20.2)(@emotion/react@11.11.3)(@types/react@18.0.26)(react@18.2.0) '@fortawesome/fontawesome-svg-core': specifier: ^6.2.1 version: 6.2.1 @@ -34,25 +34,25 @@ importers: version: 0.1.19(@fortawesome/fontawesome-svg-core@6.2.1)(react@18.2.0) '@hookform/resolvers': specifier: ^3.1.1 - version: 3.1.1(react-hook-form@7.54.2(react@18.2.0)) + version: 3.1.1(react-hook-form@7.54.2) '@mantine/code-highlight': specifier: 7.13.2 - version: 7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.13.2(@mantine/core@7.13.2)(@mantine/hooks@7.13.2)(react-dom@18.2.0)(react@18.2.0) '@mantine/core': specifier: 7.13.2 - version: 7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.13.2(@mantine/hooks@7.13.2)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) '@mantine/dates': specifier: 7.13.2 - version: 7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.13.2(@mantine/core@7.13.2)(@mantine/hooks@7.13.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': specifier: 7.13.2 version: 7.13.2(react@18.2.0) '@mantine/modals': specifier: 7.13.2 - version: 7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.13.2(@mantine/core@7.13.2)(@mantine/hooks@7.13.2)(react-dom@18.2.0)(react@18.2.0) '@mantine/notifications': specifier: ^7.13.2 - version: 7.15.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.15.2(@mantine/core@7.13.2)(@mantine/hooks@7.13.2)(react-dom@18.2.0)(react@18.2.0) '@opentelemetry/api': specifier: 1.9.0 version: 1.9.0 @@ -106,28 +106,28 @@ importers: version: 3.6.1(react@18.2.0) '@tabler/icons': specifier: ^1.119.0 - version: 1.119.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.119.0(react-dom@18.2.0)(react@18.2.0) '@tabler/icons-react': specifier: ^2.47.0 version: 2.47.0(react@18.2.0) '@tanstack/query-sync-storage-persister': specifier: ^4.20.4 - version: 4.20.4(@tanstack/query-core@4.36.1) + version: 4.20.4(@tanstack/query-core@4.20.4) '@tanstack/react-query': specifier: ^4.36.1 - version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.36.1(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-devtools': specifier: ^4.20.4 - version: 4.20.4(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.20.4(@tanstack/react-query@4.36.1)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query-persist-client': specifier: ^4.20.4 - version: 4.20.4(@tanstack/query-core@4.36.1)(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + version: 4.20.4(@tanstack/query-core@4.20.4)(@tanstack/react-query@4.36.1) '@testing-library/jest-dom': specifier: ^5.16.5 version: 5.16.5 '@testing-library/react': specifier: ^14.0.0 - version: 14.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 14.0.0(react-dom@18.2.0)(react@18.2.0) '@testing-library/user-event': specifier: ^14.4.3 version: 14.4.3(@testing-library/dom@9.3.4) @@ -139,7 +139,7 @@ importers: version: 5.14.6 '@types/testing-library__react': specifier: ^10.2.0 - version: 10.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 10.2.0(react-dom@18.2.0)(react@18.2.0) ajv: specifier: ^8.11.0 version: 8.11.0 @@ -163,7 +163,7 @@ importers: version: 5.0.1 framer-motion: specifier: ^7.6.7 - version: 7.6.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 7.6.7(react-dom@18.2.0)(react@18.2.0) idb-keyval: specifier: ^6.2.1 version: 6.2.1 @@ -187,7 +187,7 @@ importers: version: 4.17.21 mantine-react-table: specifier: 2.0.0-beta.7 - version: 2.0.0-beta.7(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(@tabler/icons-react@2.47.0(react@18.2.0))(clsx@2.0.0)(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.0.0-beta.7(@mantine/core@7.13.2)(@mantine/dates@7.13.2)(@mantine/hooks@7.13.2)(@tabler/icons-react@2.47.0)(clsx@2.0.0)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) moment: specifier: ^2.29.4 version: 2.29.4 @@ -235,22 +235,22 @@ importers: version: 7.54.2(react@18.2.0) react-router-dom: specifier: ^6.6.1 - version: 6.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 6.6.1(react-dom@18.2.0)(react@18.2.0) react-status-beacon: specifier: ^1.0.4 - version: 1.0.4(@babel/core@7.20.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0) + version: 1.0.4(@babel/core@7.20.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) react-tooltip: specifier: ^5.25.1 - version: 5.25.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.25.1(react-dom@18.2.0)(react@18.2.0) react-virtuoso: specifier: ^4.7.1 - version: 4.7.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.7.1(react-dom@18.2.0)(react@18.2.0) regenerator-runtime: specifier: ^0.13.11 version: 0.13.11 usehooks-ts: specifier: ^2.9.1 - version: 2.9.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.9.1(react-dom@18.2.0)(react@18.2.0) uuid: specifier: ^9.0.0 version: 9.0.0 @@ -259,16 +259,16 @@ importers: version: 1.5.0 vite-plugin-node-polyfills: specifier: 0.15.0 - version: 0.15.0(rollup@4.12.0)(vite@5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0)) + version: 0.15.0(vite@5.1.5) vite-tsconfig-paths: specifier: 4.2.1 - version: 4.2.1(typescript@5.7.2)(vite@5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0)) + version: 4.2.1(typescript@5.7.2)(vite@5.1.5) vitest: specifier: ^1.4.1 - version: 1.5.0(@types/node@20.11.20)(@vitest/ui@1.5.0)(happy-dom@8.1.0)(jsdom@20.0.3)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0) + version: 1.5.0(@vitest/ui@1.5.0)(happy-dom@8.1.0)(jsdom@20.0.3)(terser@5.15.0) zustand: specifier: ^4.3.7 - version: 4.3.7(immer@9.0.21)(react@18.2.0) + version: 4.3.7(react@18.2.0) devDependencies: '@faker-js/faker': specifier: ^8.0.2 @@ -296,13 +296,13 @@ importers: version: 9.0.0 '@typescript-eslint/eslint-plugin': specifier: ^5.36.2 - version: 5.36.2(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2) + version: 5.36.2(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.7.2) '@typescript-eslint/parser': specifier: ^5.62.0 version: 5.62.0(eslint@8.57.0)(typescript@5.7.2) '@vitejs/plugin-react': specifier: 4.2.1 - version: 4.2.1(vite@5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0)) + version: 4.2.1(vite@5.1.5) '@vitest/ui': specifier: ^1.4.1 version: 1.5.0(vitest@1.5.0) @@ -317,7 +317,7 @@ importers: version: 8.0.0 eslint-plugin-import: specifier: ^2.26.0 - version: 2.26.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0) + version: 2.26.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) eslint-plugin-jest-dom: specifier: ^3.9.4 version: 3.9.4(eslint@8.57.0) @@ -326,7 +326,7 @@ importers: version: 6.6.1(eslint@8.57.0) eslint-plugin-prettier: specifier: ^3.4.1 - version: 3.4.1(eslint-config-prettier@8.5.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.7.1) + version: 3.4.1(eslint-config-prettier@8.5.0)(eslint@8.57.0)(prettier@2.7.1) eslint-plugin-react: specifier: ^7.31.7 version: 7.31.7(eslint@8.57.0) @@ -350,7 +350,7 @@ importers: version: 12.0.2 openapi-typescript-validator: specifier: github:danicc097/openapi-typescript-validator - version: https://codeload.github.com/danicc097/openapi-typescript-validator/tar.gz/2227323cb4343d16a3e7d316c6bf4861ae8a52d0(ajv-formats@2.1.1(ajv@8.11.0))(ajv@8.11.0) + version: https://codeload.github.com/danicc097/openapi-typescript-validator/tar.gz/2227323cb4343d16a3e7d316c6bf4861ae8a52d0(ajv-formats@2.1.1)(ajv@8.11.0) prettier: specifier: ^2.7.1 version: 2.7.1 @@ -365,7 +365,7 @@ importers: version: 5.7.2 vite: specifier: 5.1.5 - version: 5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0) + version: 5.1.5(terser@5.15.0) packages: @@ -413,8 +413,8 @@ packages: resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} '@babel/compat-data@7.23.2': @@ -513,10 +513,6 @@ packages: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.22.15': resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} engines: {node: '>=6.9.0'} @@ -541,10 +537,13 @@ packages: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.20.3': resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} engines: {node: '>=6.0.0'} - hasBin: true '@babel/parser@7.23.0': resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} @@ -590,10 +589,6 @@ packages: resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} - engines: {node: '>=6.9.0'} - '@babel/template@7.18.10': resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} engines: {node: '>=6.9.0'} @@ -1339,8 +1334,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-user-interaction@0.44.0': - resolution: {integrity: sha512-GngN5ZKNbbzr4ebdqZHGv2I52+UNSVFKYUvRnnLy8Ei7zPJOzpRkFHhwAfYt8rr+MQgtKs5VB4VrVILr7f/N1w==} + '@opentelemetry/instrumentation-user-interaction@0.44.1': + resolution: {integrity: sha512-1T93GDxNiyq8c010/+E8tSjnnbctaJQIR8TELHRPWwbbJ/Up1+h2LDbC32Ztw/RfZ2vcWZVA16wY5JHoUiEwiQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -1688,6 +1683,9 @@ packages: resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} engines: {node: '>=12'} + '@tanstack/query-core@4.20.4': + resolution: {integrity: sha512-lhLtGVNJDsJ/DyZXrLzekDEywQqRVykgBqTmkv0La32a/RleILXy6JMLBb7UmS3QCatg/F/0N9/5b0i5j6IKcA==} + '@tanstack/query-core@4.36.1': resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} @@ -2052,15 +2050,18 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.8.0: resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} - hasBin: true acorn@8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} - hasBin: true agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -2733,7 +2734,6 @@ packages: escodegen@2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} - hasBin: true eslint-config-prettier@8.5.0: resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} @@ -2859,7 +2859,6 @@ packages: esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} - hasBin: true esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} @@ -3174,7 +3173,6 @@ packages: he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true headers-polyfill@4.0.2: resolution: {integrity: sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw==} @@ -3242,8 +3240,8 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-in-the-middle@1.12.0: - resolution: {integrity: sha512-yAgSE7GmtRcu4ZUSFX/4v69UGXwugFFSdIQJ14LHPOPPQrWv8Y7O9PHsw8Ovk7bKCLe4sjXMbZFqGFcLHpZ89w==} + import-in-the-middle@1.13.1: + resolution: {integrity: sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -3510,7 +3508,6 @@ packages: json5@2.2.1: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} - hasBin: true json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -3611,8 +3608,8 @@ packages: resolution: {integrity: sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==} engines: {node: '>= 0.6.0'} - long@5.2.4: - resolution: {integrity: sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==} + long@5.3.1: + resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -3633,7 +3630,6 @@ packages: lz-string@1.4.4: resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} - hasBin: true lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} @@ -3896,6 +3892,7 @@ packages: openapi-typescript-validator@https://codeload.github.com/danicc097/openapi-typescript-validator/tar.gz/2227323cb4343d16a3e7d316c6bf4861ae8a52d0: resolution: {tarball: https://codeload.github.com/danicc097/openapi-typescript-validator/tar.gz/2227323cb4343d16a3e7d316c6bf4861ae8a52d0} + name: openapi-typescript-validator version: 4.0.0 peerDependencies: ajv: ^8.0.0 @@ -3997,9 +3994,6 @@ packages: picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -4077,7 +4071,6 @@ packages: prettier@2.7.1: resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} - hasBin: true pretty-format@26.6.2: resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} @@ -4346,7 +4339,6 @@ packages: resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} @@ -4358,7 +4350,6 @@ packages: resolve@2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true ret@0.2.2: resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} @@ -4415,7 +4406,6 @@ packages: semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -4424,7 +4414,6 @@ packages: semver@7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} - hasBin: true semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -4673,7 +4662,6 @@ packages: terser@5.15.0: resolution: {integrity: sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==} engines: {node: '>=10'} - hasBin: true text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -4920,7 +4908,6 @@ packages: uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true validator@13.11.0: resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} @@ -5194,11 +5181,10 @@ snapshots: '@babel/highlight': 7.23.4 chalk: 2.4.2 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.24.2': dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 '@babel/compat-data@7.23.2': {} @@ -5341,8 +5327,6 @@ snapshots: '@babel/helper-validator-identifier@7.22.20': {} - '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.22.15': {} '@babel/helper-validator-option@7.23.5': {} @@ -5375,6 +5359,13 @@ snapshots: chalk: 2.4.2 js-tokens: 4.0.0 + '@babel/highlight@7.24.2': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + '@babel/parser@7.20.3': dependencies: '@babel/types': 7.23.0 @@ -5419,10 +5410,6 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@babel/runtime@7.26.0': - dependencies: - regenerator-runtime: 0.14.1 - '@babel/template@7.18.10': dependencies: '@babel/code-frame': 7.22.13 @@ -5551,13 +5538,12 @@ snapshots: '@emotion/css@11.10.5(@babel/core@7.20.2)': dependencies: + '@babel/core': 7.20.2 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.10.5 '@emotion/serialize': 1.1.1 '@emotion/sheet': 1.2.1 '@emotion/utils': 1.2.0 - optionalDependencies: - '@babel/core': 7.20.2 '@emotion/hash@0.9.1': {} @@ -5584,10 +5570,9 @@ snapshots: '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) '@emotion/utils': 1.2.1 '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.0.26 hoist-non-react-statics: 3.3.2 react: 18.2.0 - optionalDependencies: - '@types/react': 18.0.26 '@emotion/serialize@1.1.1': dependencies: @@ -5617,8 +5602,9 @@ snapshots: '@emotion/sheet@1.2.2': {} - '@emotion/styled@11.10.5(@babel/core@7.20.2)(@emotion/react@11.11.3(@types/react@18.0.26)(react@18.2.0))(@types/react@18.0.26)(react@18.2.0)': + '@emotion/styled@11.10.5(@babel/core@7.20.2)(@emotion/react@11.11.3)(@types/react@18.0.26)(react@18.2.0)': dependencies: + '@babel/core': 7.20.2 '@babel/runtime': 7.19.0 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.0 @@ -5626,10 +5612,8 @@ snapshots: '@emotion/serialize': 1.1.1 '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) '@emotion/utils': 1.2.0 - react: 18.2.0 - optionalDependencies: - '@babel/core': 7.20.2 '@types/react': 18.0.26 + react: 18.2.0 '@emotion/stylis@0.8.5': {} @@ -5832,15 +5816,15 @@ snapshots: '@floating-ui/core': 1.5.0 '@floating-ui/utils': 0.2.1 - '@floating-ui/react-dom@2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0)': dependencies: '@floating-ui/dom': 1.6.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@floating-ui/react@0.26.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react@0.26.9(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) '@floating-ui/utils': 0.2.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -5866,7 +5850,7 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 - '@hookform/resolvers@3.1.1(react-hook-form@7.54.2(react@18.2.0))': + '@hookform/resolvers@3.1.1(react-hook-form@7.54.2)': dependencies: react-hook-form: 7.54.2(react@18.2.0) @@ -5989,32 +5973,32 @@ snapshots: dependencies: jsep: 1.3.8 - '@mantine/code-highlight@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mantine/code-highlight@7.13.2(@mantine/core@7.13.2)(@mantine/hooks@7.13.2)(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@mantine/core': 7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mantine/core': 7.13.2(@mantine/hooks@7.13.2)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.13.2(react@18.2.0) clsx: 2.1.1 highlight.js: 11.9.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mantine/core@7.13.2(@mantine/hooks@7.13.2)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@floating-ui/react': 0.26.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react': 0.26.9(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.13.2(react@18.2.0) clsx: 2.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-number-format: 5.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-number-format: 5.3.1(react-dom@18.2.0)(react@18.2.0) react-remove-scroll: 2.5.7(@types/react@18.0.26)(react@18.2.0) react-textarea-autosize: 8.5.3(@types/react@18.0.26)(react@18.2.0) type-fest: 4.31.0 transitivePeerDependencies: - '@types/react' - '@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mantine/dates@7.13.2(@mantine/core@7.13.2)(@mantine/hooks@7.13.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@mantine/core': 7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mantine/core': 7.13.2(@mantine/hooks@7.13.2)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.13.2(react@18.2.0) clsx: 2.1.1 dayjs: 1.11.10 @@ -6025,21 +6009,21 @@ snapshots: dependencies: react: 18.2.0 - '@mantine/modals@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mantine/modals@7.13.2(@mantine/core@7.13.2)(@mantine/hooks@7.13.2)(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@mantine/core': 7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mantine/core': 7.13.2(@mantine/hooks@7.13.2)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.13.2(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@mantine/notifications@7.15.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@mantine/notifications@7.15.2(@mantine/core@7.13.2)(@mantine/hooks@7.13.2)(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@mantine/core': 7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mantine/core': 7.13.2(@mantine/hooks@7.13.2)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.13.2(react@18.2.0) '@mantine/store': 7.15.2(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) '@mantine/store@7.15.2(react@18.2.0)': dependencies: @@ -6128,7 +6112,7 @@ snapshots: '@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-document-load': 0.44.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-fetch': 0.57.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-user-interaction': 0.44.0(@opentelemetry/api@1.9.0)(zone.js@0.11.4) + '@opentelemetry/instrumentation-user-interaction': 0.44.1(@opentelemetry/api@1.9.0)(zone.js@0.11.4) '@opentelemetry/instrumentation-xml-http-request': 0.57.1(@opentelemetry/api@1.9.0) zone.js: 0.11.4 transitivePeerDependencies: @@ -6188,7 +6172,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-user-interaction@0.44.0(@opentelemetry/api@1.9.0)(zone.js@0.11.4)': + '@opentelemetry/instrumentation-user-interaction@0.44.1(@opentelemetry/api@1.9.0)(zone.js@0.11.4)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) @@ -6213,7 +6197,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.57.1 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.12.0 + import-in-the-middle: 1.13.1 require-in-the-middle: 7.2.0 semver: 7.5.4 shimmer: 1.2.1 @@ -6425,21 +6409,17 @@ snapshots: '@remix-run/router@1.2.1': {} - '@rollup/plugin-inject@5.0.5(rollup@4.12.0)': + '@rollup/plugin-inject@5.0.5': dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.12.0) + '@rollup/pluginutils': 5.0.5 estree-walker: 2.0.2 magic-string: 0.30.5 - optionalDependencies: - rollup: 4.12.0 - '@rollup/pluginutils@5.0.5(rollup@4.12.0)': + '@rollup/pluginutils@5.0.5': dependencies: '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 - optionalDependencies: - rollup: 4.12.0 '@rollup/rollup-android-arm-eabi@4.12.0': optional: true @@ -6656,8 +6636,8 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 - '@tabler/icons@1.119.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - optionalDependencies: + '@tabler/icons@1.119.0(react-dom@18.2.0)(react@18.2.0)': + dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -6671,49 +6651,50 @@ snapshots: dependencies: remove-accents: 0.4.2 + '@tanstack/query-core@4.20.4': {} + '@tanstack/query-core@4.36.1': {} - '@tanstack/query-persist-client-core@4.20.4(@tanstack/query-core@4.36.1)': + '@tanstack/query-persist-client-core@4.20.4(@tanstack/query-core@4.20.4)': dependencies: - '@tanstack/query-core': 4.36.1 + '@tanstack/query-core': 4.20.4 - '@tanstack/query-sync-storage-persister@4.20.4(@tanstack/query-core@4.36.1)': + '@tanstack/query-sync-storage-persister@4.20.4(@tanstack/query-core@4.20.4)': dependencies: - '@tanstack/query-persist-client-core': 4.20.4(@tanstack/query-core@4.36.1) + '@tanstack/query-persist-client-core': 4.20.4(@tanstack/query-core@4.20.4) transitivePeerDependencies: - '@tanstack/query-core' - '@tanstack/react-query-devtools@4.20.4(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-query-devtools@4.20.4(@tanstack/react-query@4.36.1)(react-dom@18.2.0)(react@18.2.0)': dependencies: '@tanstack/match-sorter-utils': 8.8.4 - '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) superjson: 1.12.3 use-sync-external-store: 1.2.0(react@18.2.0) - '@tanstack/react-query-persist-client@4.20.4(@tanstack/query-core@4.36.1)(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + '@tanstack/react-query-persist-client@4.20.4(@tanstack/query-core@4.20.4)(@tanstack/react-query@4.36.1)': dependencies: - '@tanstack/query-persist-client-core': 4.20.4(@tanstack/query-core@4.36.1) - '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tanstack/query-persist-client-core': 4.20.4(@tanstack/query-core@4.20.4) + '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) transitivePeerDependencies: - '@tanstack/query-core' - '@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-query@4.36.1(react-dom@18.2.0)(react@18.2.0)': dependencies: '@tanstack/query-core': 4.36.1 react: 18.2.0 - use-sync-external-store: 1.2.0(react@18.2.0) - optionalDependencies: react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.0(react@18.2.0) - '@tanstack/react-table@8.20.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-table@8.20.5(react-dom@18.2.0)(react@18.2.0)': dependencies: '@tanstack/table-core': 8.20.5 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@tanstack/react-virtual@3.10.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-virtual@3.10.8(react-dom@18.2.0)(react@18.2.0)': dependencies: '@tanstack/virtual-core': 3.10.8 react: 18.2.0 @@ -6747,8 +6728,8 @@ snapshots: '@testing-library/dom@9.3.4': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/runtime': 7.26.0 + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.1 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -6768,7 +6749,7 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@14.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@testing-library/react@14.0.0(react-dom@18.2.0)(react@18.2.0)': dependencies: '@babel/runtime': 7.19.0 '@testing-library/dom': 9.3.1 @@ -6895,9 +6876,9 @@ snapshots: dependencies: '@types/jest': 29.5.2 - '@types/testing-library__react@10.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@types/testing-library__react@10.2.0(react-dom@18.2.0)(react@18.2.0)': dependencies: - '@testing-library/react': 14.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@testing-library/react': 14.0.0(react-dom@18.2.0)(react@18.2.0) transitivePeerDependencies: - react - react-dom @@ -6918,7 +6899,7 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.0 - '@typescript-eslint/eslint-plugin@5.36.2(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@5.36.2(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.7.2) '@typescript-eslint/scope-manager': 5.36.2 @@ -6931,7 +6912,6 @@ snapshots: regexpp: 3.2.0 semver: 7.3.7 tsutils: 3.21.0(typescript@5.7.2) - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6943,7 +6923,6 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6965,7 +6944,6 @@ snapshots: debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 tsutils: 3.21.0(typescript@5.7.2) - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6983,7 +6961,6 @@ snapshots: is-glob: 4.0.3 semver: 7.5.4 tsutils: 3.21.0(typescript@5.7.2) - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6997,7 +6974,6 @@ snapshots: is-glob: 4.0.3 semver: 7.5.4 tsutils: 3.21.0(typescript@5.7.2) - optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -7027,14 +7003,14 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.2.1(vite@5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0))': + '@vitejs/plugin-react@4.2.1(vite@5.1.5)': dependencies: '@babel/core': 7.23.9 '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.9) '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.9) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0) + vite: 5.1.5(terser@5.15.0) transitivePeerDependencies: - supports-color @@ -7069,7 +7045,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.0.0 sirv: 2.0.4 - vitest: 1.5.0(@types/node@20.11.20)(@vitest/ui@1.5.0)(happy-dom@8.1.0)(jsdom@20.0.3)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0) + vitest: 1.5.0(@vitest/ui@1.5.0)(happy-dom@8.1.0)(jsdom@20.0.3)(terser@5.15.0) '@vitest/utils@1.5.0': dependencies: @@ -7089,9 +7065,9 @@ snapshots: acorn: 8.11.2 acorn-walk: 8.2.0 - acorn-import-attributes@1.9.5(acorn@8.11.3): + acorn-import-attributes@1.9.5(acorn@8.14.1): dependencies: - acorn: 8.11.3 + acorn: 8.14.1 acorn-jsx@5.3.2(acorn@8.11.2): dependencies: @@ -7105,6 +7081,8 @@ snapshots: acorn@8.11.3: {} + acorn@8.14.1: {} + acorn@8.8.0: {} acorn@8.8.1: {} @@ -7116,7 +7094,7 @@ snapshots: - supports-color ajv-draft-04@1.0.0(ajv@8.12.0): - optionalDependencies: + dependencies: ajv: 8.12.0 ajv-errors@3.0.0(ajv@8.12.0): @@ -7124,11 +7102,11 @@ snapshots: ajv: 8.12.0 ajv-formats@2.1.1(ajv@8.11.0): - optionalDependencies: + dependencies: ajv: 8.11.0 ajv-formats@2.1.1(ajv@8.12.0): - optionalDependencies: + dependencies: ajv: 8.12.0 ajv@6.12.6: @@ -7274,14 +7252,14 @@ snapshots: cosmiconfig: 7.0.1 resolve: 1.22.2 - babel-plugin-styled-components@2.1.4(@babel/core@7.20.2)(styled-components@5.3.11(@babel/core@7.20.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0)): + babel-plugin-styled-components@2.1.4(@babel/core@7.20.2)(styled-components@5.3.11): dependencies: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.15 '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.20.2) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.20.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0) + styled-components: 5.3.11(@babel/core@7.20.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) transitivePeerDependencies: - '@babel/core' @@ -7639,7 +7617,6 @@ snapshots: debug@4.3.4(supports-color@5.5.0): dependencies: ms: 2.1.2 - optionalDependencies: supports-color: 5.5.0 decimal.js@10.4.3: {} @@ -8016,11 +7993,10 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.7.4(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.6)(eslint@8.57.0): + eslint-module-utils@2.7.4(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.6)(eslint@8.57.0): dependencies: - debug: 3.2.7 - optionalDependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.7.2) + debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.6 transitivePeerDependencies: @@ -8030,15 +8006,16 @@ snapshots: dependencies: htmlparser2: 9.1.0 - eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0): + eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.7.2) array-includes: 3.1.5 array.prototype.flat: 1.3.0 debug: 2.6.9 doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.6)(eslint@8.57.0) + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.6)(eslint@8.57.0) has: 1.0.3 is-core-module: 2.10.0 is-glob: 4.0.3 @@ -8046,8 +8023,6 @@ snapshots: object.values: 1.1.5 resolve: 1.22.1 tsconfig-paths: 3.14.1 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -8077,13 +8052,12 @@ snapshots: minimatch: 3.1.2 semver: 6.3.0 - eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.5.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.7.1): + eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.5.0)(eslint@8.57.0)(prettier@2.7.1): dependencies: eslint: 8.57.0 + eslint-config-prettier: 8.5.0(eslint@8.57.0) prettier: 2.7.1 prettier-linter-helpers: 1.0.0 - optionalDependencies: - eslint-config-prettier: 8.5.0(eslint@8.57.0) eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): dependencies: @@ -8335,7 +8309,7 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - framer-motion@7.6.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + framer-motion@7.6.7(react-dom@18.2.0)(react@18.2.0): dependencies: '@motionone/dom': 10.13.1 framesync: 6.1.2 @@ -8597,10 +8571,10 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.12.0: + import-in-the-middle@1.13.1: dependencies: - acorn: 8.11.3 - acorn-import-attributes: 1.9.5(acorn@8.11.3) + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 @@ -8973,7 +8947,7 @@ snapshots: loglevel@1.8.1: {} - long@5.2.4: {} + long@5.3.1: {} loose-envify@1.4.0: dependencies: @@ -9003,15 +8977,15 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - mantine-react-table@2.0.0-beta.7(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(@tabler/icons-react@2.47.0(react@18.2.0))(clsx@2.0.0)(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + mantine-react-table@2.0.0-beta.7(@mantine/core@7.13.2)(@mantine/dates@7.13.2)(@mantine/hooks@7.13.2)(@tabler/icons-react@2.47.0)(clsx@2.0.0)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0): dependencies: - '@mantine/core': 7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@mantine/dates': 7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.2.0))(@types/react@18.0.26)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mantine/hooks@7.13.2(react@18.2.0))(dayjs@1.11.10)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mantine/core': 7.13.2(@mantine/hooks@7.13.2)(@types/react@18.0.26)(react-dom@18.2.0)(react@18.2.0) + '@mantine/dates': 7.13.2(@mantine/core@7.13.2)(@mantine/hooks@7.13.2)(dayjs@1.11.10)(react-dom@18.2.0)(react@18.2.0) '@mantine/hooks': 7.13.2(react@18.2.0) '@tabler/icons-react': 2.47.0(react@18.2.0) '@tanstack/match-sorter-utils': 8.19.4 - '@tanstack/react-table': 8.20.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tanstack/react-virtual': 3.10.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tanstack/react-table': 8.20.5(react-dom@18.2.0)(react@18.2.0) + '@tanstack/react-virtual': 3.10.8(react-dom@18.2.0)(react@18.2.0) clsx: 2.0.0 dayjs: 1.11.10 react: 18.2.0 @@ -9113,9 +9087,8 @@ snapshots: path-to-regexp: 6.2.1 strict-event-emitter: 0.5.1 type-fest: 4.10.2 - yargs: 17.7.2 - optionalDependencies: typescript: 5.7.2 + yargs: 17.7.2 mute-stream@1.0.0: {} @@ -9293,7 +9266,8 @@ snapshots: openapi-types@12.0.2: {} - openapi-typescript-validator@https://codeload.github.com/danicc097/openapi-typescript-validator/tar.gz/2227323cb4343d16a3e7d316c6bf4861ae8a52d0(ajv-formats@2.1.1(ajv@8.11.0))(ajv@8.11.0): + openapi-typescript-validator@https://codeload.github.com/danicc097/openapi-typescript-validator/tar.gz/2227323cb4343d16a3e7d316c6bf4861ae8a52d0(ajv-formats@2.1.1)(ajv@8.11.0): + id: openapi-typescript-validator@https://codeload.github.com/danicc097/openapi-typescript-validator/tar.gz/2227323cb4343d16a3e7d316c6bf4861ae8a52d0 dependencies: '@openapi-contrib/openapi-schema-to-json-schema': 3.3.2 ajv: 8.11.0 @@ -9434,8 +9408,6 @@ snapshots: picocolors@1.0.0: {} - picocolors@1.1.1: {} - picomatch@2.3.1: {} pkg-dir@5.0.0: @@ -9560,7 +9532,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/node': 20.11.20 - long: 5.2.4 + long: 5.3.1 proxy-from-env@1.1.0: {} @@ -9634,7 +9606,7 @@ snapshots: react-is@18.2.0: {} - react-number-format@5.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-number-format@5.3.1(react-dom@18.2.0)(react@18.2.0): dependencies: prop-types: 15.8.1 react: 18.2.0 @@ -9644,24 +9616,22 @@ snapshots: react-remove-scroll-bar@2.3.4(@types/react@18.0.26)(react@18.2.0): dependencies: + '@types/react': 18.0.26 react: 18.2.0 react-style-singleton: 2.2.1(@types/react@18.0.26)(react@18.2.0) tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.0.26 react-remove-scroll@2.5.7(@types/react@18.0.26)(react@18.2.0): dependencies: + '@types/react': 18.0.26 react: 18.2.0 react-remove-scroll-bar: 2.3.4(@types/react@18.0.26)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.0.26)(react@18.2.0) tslib: 2.6.2 use-callback-ref: 1.3.0(@types/react@18.0.26)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.0.26)(react@18.2.0) - optionalDependencies: - '@types/react': 18.0.26 - react-router-dom@6.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-router-dom@6.6.1(react-dom@18.2.0)(react@18.2.0): dependencies: '@remix-run/router': 1.2.1 react: 18.2.0 @@ -9677,12 +9647,12 @@ snapshots: dependencies: react: 18.2.0 - react-status-beacon@1.0.4(@babel/core@7.20.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0): + react-status-beacon@1.0.4(@babel/core@7.20.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): dependencies: lodash: 4.17.21 prop-types: 15.8.1 react: 18.2.0 - styled-components: 5.3.11(@babel/core@7.20.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0) + styled-components: 5.3.11(@babel/core@7.20.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0) transitivePeerDependencies: - '@babel/core' - react-dom @@ -9690,12 +9660,11 @@ snapshots: react-style-singleton@2.2.1(@types/react@18.0.26)(react@18.2.0): dependencies: + '@types/react': 18.0.26 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.0.26 react-textarea-autosize@8.5.3(@types/react@18.0.26)(react@18.2.0): dependencies: @@ -9706,14 +9675,14 @@ snapshots: transitivePeerDependencies: - '@types/react' - react-tooltip@5.25.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-tooltip@5.25.1(react-dom@18.2.0)(react@18.2.0): dependencies: '@floating-ui/dom': 1.5.3 classnames: 2.5.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): dependencies: '@babel/runtime': 7.24.1 dom-helpers: 5.2.1 @@ -9722,7 +9691,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-virtuoso@4.7.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-virtuoso@4.7.1(react-dom@18.2.0)(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -10118,14 +10087,14 @@ snapshots: hey-listen: 1.0.8 tslib: 2.4.0 - styled-components@5.3.11(@babel/core@7.20.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0): + styled-components@5.3.11(@babel/core@7.20.2)(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0): dependencies: '@babel/helper-module-imports': 7.22.15 '@babel/traverse': 7.23.2(supports-color@5.5.0) '@emotion/is-prop-valid': 1.2.0 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.20.2)(styled-components@5.3.11(@babel/core@7.20.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0)) + babel-plugin-styled-components: 2.1.4(@babel/core@7.20.2)(styled-components@5.3.11) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 @@ -10236,7 +10205,7 @@ snapshots: ts-algebra@1.2.0: {} tsconfck@2.1.2(typescript@5.7.2): - optionalDependencies: + dependencies: typescript: 5.7.2 tsconfig-paths@3.14.1: @@ -10359,10 +10328,9 @@ snapshots: use-callback-ref@1.3.0(@types/react@18.0.26)(react@18.2.0): dependencies: + '@types/react': 18.0.26 react: 18.2.0 tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.0.26 use-composed-ref@1.3.0(react@18.2.0): dependencies: @@ -10370,30 +10338,27 @@ snapshots: use-isomorphic-layout-effect@1.1.2(@types/react@18.0.26)(react@18.2.0): dependencies: - react: 18.2.0 - optionalDependencies: '@types/react': 18.0.26 + react: 18.2.0 use-latest@1.2.1(@types/react@18.0.26)(react@18.2.0): dependencies: + '@types/react': 18.0.26 react: 18.2.0 use-isomorphic-layout-effect: 1.1.2(@types/react@18.0.26)(react@18.2.0) - optionalDependencies: - '@types/react': 18.0.26 use-sidecar@1.1.2(@types/react@18.0.26)(react@18.2.0): dependencies: + '@types/react': 18.0.26 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 - optionalDependencies: - '@types/react': 18.0.26 use-sync-external-store@1.2.0(react@18.2.0): dependencies: react: 18.2.0 - usehooks-ts@2.9.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + usehooks-ts@2.9.1(react-dom@18.2.0)(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -10414,13 +10379,13 @@ snapshots: validator@13.11.0: {} - vite-node@1.5.0(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0): + vite-node@1.5.0(terser@5.15.0): dependencies: cac: 6.7.14 debug: 4.3.4(supports-color@5.5.0) pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0) + vite: 5.1.5(terser@5.15.0) transitivePeerDependencies: - '@types/node' - less @@ -10438,49 +10403,49 @@ snapshots: fast-glob: 3.3.1 magic-string: 0.30.5 - vite-plugin-node-polyfills@0.15.0(rollup@4.12.0)(vite@5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0)): + vite-plugin-node-polyfills@0.15.0(vite@5.1.5): dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.12.0) + '@rollup/plugin-inject': 5.0.5 buffer-polyfill: buffer@6.0.3 node-stdlib-browser: 1.2.0 process: 0.11.10 - vite: 5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0) + vite: 5.1.5(terser@5.15.0) transitivePeerDependencies: - rollup - vite-tsconfig-paths@4.2.1(typescript@5.7.2)(vite@5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0)): + vite-tsconfig-paths@4.2.1(typescript@5.7.2)(vite@5.1.5): dependencies: debug: 4.3.4(supports-color@5.5.0) globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.7.2) - optionalDependencies: - vite: 5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0) + vite: 5.1.5(terser@5.15.0) transitivePeerDependencies: - supports-color - typescript - vite@5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0): + vite@5.1.5(terser@5.15.0): dependencies: esbuild: 0.19.10 postcss: 8.4.35 rollup: 4.12.0 + terser: 5.15.0 optionalDependencies: - '@types/node': 20.11.20 fsevents: 2.3.3 - sugarss: 4.0.1(postcss@8.4.24) - terser: 5.15.0 - vitest@1.5.0(@types/node@20.11.20)(@vitest/ui@1.5.0)(happy-dom@8.1.0)(jsdom@20.0.3)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0): + vitest@1.5.0(@vitest/ui@1.5.0)(happy-dom@8.1.0)(jsdom@20.0.3)(terser@5.15.0): dependencies: '@vitest/expect': 1.5.0 '@vitest/runner': 1.5.0 '@vitest/snapshot': 1.5.0 '@vitest/spy': 1.5.0 + '@vitest/ui': 1.5.0(vitest@1.5.0) '@vitest/utils': 1.5.0 acorn-walk: 8.3.2 chai: 4.3.10 debug: 4.3.4(supports-color@5.5.0) execa: 8.0.1 + happy-dom: 8.1.0 + jsdom: 20.0.3 local-pkg: 0.5.0 magic-string: 0.30.5 pathe: 1.1.2 @@ -10489,14 +10454,9 @@ snapshots: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.3 - vite: 5.1.5(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0) - vite-node: 1.5.0(@types/node@20.11.20)(sugarss@4.0.1(postcss@8.4.24))(terser@5.15.0) + vite: 5.1.5(terser@5.15.0) + vite-node: 1.5.0(terser@5.15.0) why-is-node-running: 2.2.2 - optionalDependencies: - '@types/node': 20.11.20 - '@vitest/ui': 1.5.0(vitest@1.5.0) - happy-dom: 8.1.0 - jsdom: 20.0.3 transitivePeerDependencies: - less - lightningcss @@ -10618,9 +10578,7 @@ snapshots: dependencies: tslib: 2.6.2 - zustand@4.3.7(immer@9.0.21)(react@18.2.0): + zustand@4.3.7(react@18.2.0): dependencies: - use-sync-external-store: 1.2.0(react@18.2.0) - optionalDependencies: - immer: 9.0.21 react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) From 6d9b94593b285eee57c7da9e8d46573f4c271402 Mon Sep 17 00:00:00 2001 From: Daniel Castro Date: Sun, 9 Mar 2025 17:52:17 +0100 Subject: [PATCH 10/14] pnpm v update --- .github/actions/setup/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup/action.yaml b/.github/actions/setup/action.yaml index af71a8b84..840948dd1 100644 --- a/.github/actions/setup/action.yaml +++ b/.github/actions/setup/action.yaml @@ -28,7 +28,7 @@ runs: - uses: pnpm/action-setup@v2 with: - version: 8.3.1 + version: 9.12.0 run_install: false - name: Setup pnpm cache (1) From 01687e131419821fa091e8f5116dc8e8189c76d3 Mon Sep 17 00:00:00 2001 From: Daniel Castro Date: Sun, 9 Mar 2025 18:05:21 +0100 Subject: [PATCH 11/14] column --- bin/.project.dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/.project.dependencies.sh b/bin/.project.dependencies.sh index 9b2f0d4f6..c07f2951a 100644 --- a/bin/.project.dependencies.sh +++ b/bin/.project.dependencies.sh @@ -52,7 +52,7 @@ install.bin.column() { cp .libs/column ../bin/tools/ cd .. rm -rf util-linux-2.* - column --version + column --version || column -v } 2>&4 | xlog >&3; } 4>&1 | xerr >&3; } 3>&1 } From ec4f93c693d1d57b39797535196ec1c19aaa6344 Mon Sep 17 00:00:00 2001 From: Daniel Castro Date: Sun, 9 Mar 2025 18:19:02 +0100 Subject: [PATCH 12/14] update test os --- .github/workflows/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 2ee39cc84..be98621e3 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -16,7 +16,7 @@ on: jobs: run: timeout-minutes: 60 - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v3 with: From 1f28bdd4c08b3477da7c02bfa64f25f273cf175b Mon Sep 17 00:00:00 2001 From: Daniel Castro Date: Sun, 9 Mar 2025 18:34:59 +0100 Subject: [PATCH 13/14] fix wrong paths --- .envrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.envrc b/.envrc index 31aa5fc9b..0f92b8dc0 100644 --- a/.envrc +++ b/.envrc @@ -2,9 +2,9 @@ # prepending export GOBIN=$PWD/bin/tools -export GOBIN=$PWD/bin/tools/bin export PATH=$GOBIN:$PATH export PATH=$GOBIN/bin:$PATH +export PATH=$PWD/bin/tools/bin:$PATH export PATH=$PWD/bin:$PATH export PATH=$PWD/bin/build:$PATH From 56436d2f2354eb7d83446cb9764fa606a376ae40 Mon Sep 17 00:00:00 2001 From: Daniel Castro Date: Sun, 9 Mar 2025 19:05:08 +0100 Subject: [PATCH 14/14] lint --- frontend/src/utils/formGeneration.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/utils/formGeneration.tsx b/frontend/src/utils/formGeneration.tsx index 97f73c3e3..0e7747104 100644 --- a/frontend/src/utils/formGeneration.tsx +++ b/frontend/src/utils/formGeneration.tsx @@ -743,10 +743,10 @@ const GeneratedInput = ({ schemaKey, props, formField, index }: GeneratedInputPr ? // TODO: use convertValueByType { valueAsDate: true, setValueAs: (v) => (v === '' ? undefined : new Date(v)) } : type === 'integer' - ? { valueAsNumber: true, setValueAs: (v) => (v === '' ? undefined : parseInt(v, 10)) } - : type === 'number' - ? { valueAsNumber: true, setValueAs: (v) => (v === '' ? undefined : parseFloat(v)) } - : null), + ? { valueAsNumber: true, setValueAs: (v) => (v === '' ? undefined : parseInt(v, 10)) } + : type === 'number' + ? { valueAsNumber: true, setValueAs: (v) => (v === '' ? undefined : parseFloat(v)) } + : null), }) const fieldState = form.getFieldState(formField)