From ffdb6f19007be89e532193f68fbd1287aa1b0474 Mon Sep 17 00:00:00 2001 From: RW Date: Sat, 23 Aug 2025 00:18:00 +0200 Subject: [PATCH 1/2] fix: refine utils migration --- cmd/internal/migrations/lists.go | 1 + cmd/internal/migrations/v3/common.go | 43 +++++++++++++++++++ cmd/internal/migrations/v3/common_test.go | 51 +++++++++++++++++++++++ 3 files changed, 95 insertions(+) diff --git a/cmd/internal/migrations/lists.go b/cmd/internal/migrations/lists.go index dc190d9..1820d26 100644 --- a/cmd/internal/migrations/lists.go +++ b/cmd/internal/migrations/lists.go @@ -47,6 +47,7 @@ var Migrations = []Migration{ v3migrations.MigrateCORSConfig, v3migrations.MigrateCSRFConfig, v3migrations.MigrateMonitorImport, + v3migrations.MigrateUtilsImport, v3migrations.MigrateHealthcheckConfig, v3migrations.MigrateProxyTLSConfig, v3migrations.MigrateAppTestConfig, diff --git a/cmd/internal/migrations/v3/common.go b/cmd/internal/migrations/v3/common.go index 8ba3a63..28eb1fe 100644 --- a/cmd/internal/migrations/v3/common.go +++ b/cmd/internal/migrations/v3/common.go @@ -521,6 +521,49 @@ func MigrateMonitorImport(cmd *cobra.Command, cwd string, _, _ *semver.Version) return nil } +// MigrateUtilsImport replaces old Fiber utils imports and updates removed helpers +func MigrateUtilsImport(cmd *cobra.Command, cwd string, _, _ *semver.Version) error { + reImport := regexp.MustCompile(`github\.com/gofiber/fiber/v\d+/utils`) + + err := internal.ChangeFileContent(cwd, func(content string) string { + // update import path + content = reImport.ReplaceAllString(content, "github.com/gofiber/utils") + + // protect byte helper replacements so we can safely map string helpers to the + // standard library without affecting byte-based calls + content = strings.ReplaceAll(content, "utils.TrimRightBytes", "utils.__fiberTrimRight__") + content = strings.ReplaceAll(content, "utils.TrimLeftBytes", "utils.__fiberTrimLeft__") + content = strings.ReplaceAll(content, "utils.TrimBytes", "utils.__fiberTrim__") + content = strings.ReplaceAll(content, "utils.EqualFoldBytes", "utils.__fiberEqualFold__") + + // map removed string helpers to the strings package + content = strings.ReplaceAll(content, "utils.TrimRight", "strings.TrimRight") + content = strings.ReplaceAll(content, "utils.TrimLeft", "strings.TrimLeft") + content = strings.ReplaceAll(content, "utils.Trim", "strings.Trim") + content = strings.ReplaceAll(content, "utils.EqualFold", "strings.EqualFold") + + // restore byte helper placeholders to their new names + content = strings.ReplaceAll(content, "utils.__fiberTrimRight__", "utils.TrimRight") + content = strings.ReplaceAll(content, "utils.__fiberTrimLeft__", "utils.TrimLeft") + content = strings.ReplaceAll(content, "utils.__fiberTrim__", "utils.Trim") + content = strings.ReplaceAll(content, "utils.__fiberEqualFold__", "utils.EqualFold") + + // other removed helpers + content = strings.ReplaceAll(content, "utils.GetString", "utils.ToString") + content = strings.ReplaceAll(content, "utils.GetBytes", "utils.CopyBytes") + content = strings.ReplaceAll(content, "utils.ImmutableString", "string") + content = strings.ReplaceAll(content, "utils.AssertEqual", "assert.Equal") + + return content + }) + if err != nil { + return fmt.Errorf("failed to migrate utils imports: %w", err) + } + + cmd.Println("Migrating utils imports") + return nil +} + // MigrateProxyTLSConfig updates proxy TLS helper to new client configuration func MigrateProxyTLSConfig(cmd *cobra.Command, cwd string, _, _ *semver.Version) error { re := regexp.MustCompile(`proxy\.WithTlsConfig\(([^)]+)\)`) diff --git a/cmd/internal/migrations/v3/common_test.go b/cmd/internal/migrations/v3/common_test.go index 80dd8fb..817f05a 100644 --- a/cmd/internal/migrations/v3/common_test.go +++ b/cmd/internal/migrations/v3/common_test.go @@ -554,6 +554,57 @@ var _ = monitor.New()`) assert.Contains(t, buf.String(), "Migrating monitor middleware import") } +func Test_MigrateUtilsImport(t *testing.T) { + t.Parallel() + + dir, err := os.MkdirTemp("", "mutils") + require.NoError(t, err) + defer func() { require.NoError(t, os.RemoveAll(dir)) }() + + file := writeTempFile(t, dir, `package main +import "github.com/gofiber/fiber/v3/utils" +var ( + _ = utils.TrimBytes([]byte("x"), " ") + _ = utils.TrimRightBytes([]byte("x"), " ") + _ = utils.TrimLeftBytes([]byte("x"), " ") + _ = utils.EqualFoldBytes([]byte("A"), []byte("a")) + _ = utils.Trim(" x ", " ") + _ = utils.TrimRight("x ", " ") + _ = utils.TrimLeft(" x", " ") + _ = utils.EqualFold("A", "a") + _ = utils.GetString([]byte("a")) + _ = utils.GetBytes("a") + _ = utils.ImmutableString([]byte("b")) +)`) + + var buf bytes.Buffer + cmd := newCmd(&buf) + require.NoError(t, v3.MigrateUtilsImport(cmd, dir, nil, nil)) + + content := readFile(t, file) + assert.Contains(t, content, "github.com/gofiber/utils\"") + assert.NotContains(t, content, "fiber/v3/utils") + assert.NotContains(t, content, "TrimBytes(") + assert.NotContains(t, content, "TrimRightBytes(") + assert.NotContains(t, content, "TrimLeftBytes(") + assert.NotContains(t, content, "EqualFoldBytes(") + assert.NotContains(t, content, "GetString(") + assert.NotContains(t, content, "GetBytes(") + assert.NotContains(t, content, "ImmutableString(") + assert.Contains(t, content, "utils.Trim(") + assert.Contains(t, content, "utils.TrimRight(") + assert.Contains(t, content, "utils.TrimLeft(") + assert.Contains(t, content, "utils.EqualFold(") + assert.Contains(t, content, "strings.Trim(") + assert.Contains(t, content, "strings.TrimRight(") + assert.Contains(t, content, "strings.TrimLeft(") + assert.Contains(t, content, "strings.EqualFold(") + assert.Contains(t, content, "utils.ToString(") + assert.Contains(t, content, "utils.CopyBytes(") + assert.Contains(t, content, "string([]byte(\"b\"))") + assert.Contains(t, buf.String(), "Migrating utils imports") +} + func Test_MigrateProxyTLSConfig(t *testing.T) { t.Parallel() From b30cbd48b7b4d91f7de36b0684ed7dbddca4d380 Mon Sep 17 00:00:00 2001 From: RW Date: Sat, 23 Aug 2025 00:39:47 +0200 Subject: [PATCH 2/2] fix: update utils import to v2 --- cmd/internal/migrations/v3/common.go | 78 +++++++++++------------ cmd/internal/migrations/v3/common_test.go | 46 ++++++------- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/cmd/internal/migrations/v3/common.go b/cmd/internal/migrations/v3/common.go index 28eb1fe..4d9668a 100644 --- a/cmd/internal/migrations/v3/common.go +++ b/cmd/internal/migrations/v3/common.go @@ -523,45 +523,45 @@ func MigrateMonitorImport(cmd *cobra.Command, cwd string, _, _ *semver.Version) // MigrateUtilsImport replaces old Fiber utils imports and updates removed helpers func MigrateUtilsImport(cmd *cobra.Command, cwd string, _, _ *semver.Version) error { - reImport := regexp.MustCompile(`github\.com/gofiber/fiber/v\d+/utils`) - - err := internal.ChangeFileContent(cwd, func(content string) string { - // update import path - content = reImport.ReplaceAllString(content, "github.com/gofiber/utils") - - // protect byte helper replacements so we can safely map string helpers to the - // standard library without affecting byte-based calls - content = strings.ReplaceAll(content, "utils.TrimRightBytes", "utils.__fiberTrimRight__") - content = strings.ReplaceAll(content, "utils.TrimLeftBytes", "utils.__fiberTrimLeft__") - content = strings.ReplaceAll(content, "utils.TrimBytes", "utils.__fiberTrim__") - content = strings.ReplaceAll(content, "utils.EqualFoldBytes", "utils.__fiberEqualFold__") - - // map removed string helpers to the strings package - content = strings.ReplaceAll(content, "utils.TrimRight", "strings.TrimRight") - content = strings.ReplaceAll(content, "utils.TrimLeft", "strings.TrimLeft") - content = strings.ReplaceAll(content, "utils.Trim", "strings.Trim") - content = strings.ReplaceAll(content, "utils.EqualFold", "strings.EqualFold") - - // restore byte helper placeholders to their new names - content = strings.ReplaceAll(content, "utils.__fiberTrimRight__", "utils.TrimRight") - content = strings.ReplaceAll(content, "utils.__fiberTrimLeft__", "utils.TrimLeft") - content = strings.ReplaceAll(content, "utils.__fiberTrim__", "utils.Trim") - content = strings.ReplaceAll(content, "utils.__fiberEqualFold__", "utils.EqualFold") - - // other removed helpers - content = strings.ReplaceAll(content, "utils.GetString", "utils.ToString") - content = strings.ReplaceAll(content, "utils.GetBytes", "utils.CopyBytes") - content = strings.ReplaceAll(content, "utils.ImmutableString", "string") - content = strings.ReplaceAll(content, "utils.AssertEqual", "assert.Equal") - - return content - }) - if err != nil { - return fmt.Errorf("failed to migrate utils imports: %w", err) - } - - cmd.Println("Migrating utils imports") - return nil + reImport := regexp.MustCompile(`(?m)^(\s*(?:\w+\s+)?)"github\.com/gofiber/fiber/v\d+/utils"$`) + + err := internal.ChangeFileContent(cwd, func(content string) string { + // update import path + content = reImport.ReplaceAllString(content, `$1"github.com/gofiber/utils/v2"`) + + // protect byte helper replacements so we can safely map string helpers to the + // standard library without affecting byte-based calls + content = strings.ReplaceAll(content, "utils.TrimRightBytes", "utils.__fiberTrimRight__") + content = strings.ReplaceAll(content, "utils.TrimLeftBytes", "utils.__fiberTrimLeft__") + content = strings.ReplaceAll(content, "utils.TrimBytes", "utils.__fiberTrim__") + content = strings.ReplaceAll(content, "utils.EqualFoldBytes", "utils.__fiberEqualFold__") + + // map removed string helpers to the strings package + content = strings.ReplaceAll(content, "utils.TrimRight", "strings.TrimRight") + content = strings.ReplaceAll(content, "utils.TrimLeft", "strings.TrimLeft") + content = strings.ReplaceAll(content, "utils.Trim", "strings.Trim") + content = strings.ReplaceAll(content, "utils.EqualFold", "strings.EqualFold") + + // restore byte helper placeholders to their new names + content = strings.ReplaceAll(content, "utils.__fiberTrimRight__", "utils.TrimRight") + content = strings.ReplaceAll(content, "utils.__fiberTrimLeft__", "utils.TrimLeft") + content = strings.ReplaceAll(content, "utils.__fiberTrim__", "utils.Trim") + content = strings.ReplaceAll(content, "utils.__fiberEqualFold__", "utils.EqualFold") + + // other removed helpers + content = strings.ReplaceAll(content, "utils.GetString", "utils.ToString") + content = strings.ReplaceAll(content, "utils.GetBytes", "utils.CopyBytes") + content = strings.ReplaceAll(content, "utils.ImmutableString", "string") + content = strings.ReplaceAll(content, "utils.AssertEqual", "assert.Equal") + + return content + }) + if err != nil { + return fmt.Errorf("failed to migrate utils imports: %w", err) + } + + cmd.Println("Migrating utils imports") + return nil } // MigrateProxyTLSConfig updates proxy TLS helper to new client configuration diff --git a/cmd/internal/migrations/v3/common_test.go b/cmd/internal/migrations/v3/common_test.go index 817f05a..350d5e2 100644 --- a/cmd/internal/migrations/v3/common_test.go +++ b/cmd/internal/migrations/v3/common_test.go @@ -561,7 +561,7 @@ func Test_MigrateUtilsImport(t *testing.T) { require.NoError(t, err) defer func() { require.NoError(t, os.RemoveAll(dir)) }() - file := writeTempFile(t, dir, `package main + file := writeTempFile(t, dir, `package main import "github.com/gofiber/fiber/v3/utils" var ( _ = utils.TrimBytes([]byte("x"), " ") @@ -581,28 +581,28 @@ var ( cmd := newCmd(&buf) require.NoError(t, v3.MigrateUtilsImport(cmd, dir, nil, nil)) - content := readFile(t, file) - assert.Contains(t, content, "github.com/gofiber/utils\"") - assert.NotContains(t, content, "fiber/v3/utils") - assert.NotContains(t, content, "TrimBytes(") - assert.NotContains(t, content, "TrimRightBytes(") - assert.NotContains(t, content, "TrimLeftBytes(") - assert.NotContains(t, content, "EqualFoldBytes(") - assert.NotContains(t, content, "GetString(") - assert.NotContains(t, content, "GetBytes(") - assert.NotContains(t, content, "ImmutableString(") - assert.Contains(t, content, "utils.Trim(") - assert.Contains(t, content, "utils.TrimRight(") - assert.Contains(t, content, "utils.TrimLeft(") - assert.Contains(t, content, "utils.EqualFold(") - assert.Contains(t, content, "strings.Trim(") - assert.Contains(t, content, "strings.TrimRight(") - assert.Contains(t, content, "strings.TrimLeft(") - assert.Contains(t, content, "strings.EqualFold(") - assert.Contains(t, content, "utils.ToString(") - assert.Contains(t, content, "utils.CopyBytes(") - assert.Contains(t, content, "string([]byte(\"b\"))") - assert.Contains(t, buf.String(), "Migrating utils imports") + content := readFile(t, file) + assert.Contains(t, content, "github.com/gofiber/utils/v2\"") + assert.NotContains(t, content, "fiber/v3/utils") + assert.NotContains(t, content, "TrimBytes(") + assert.NotContains(t, content, "TrimRightBytes(") + assert.NotContains(t, content, "TrimLeftBytes(") + assert.NotContains(t, content, "EqualFoldBytes(") + assert.NotContains(t, content, "GetString(") + assert.NotContains(t, content, "GetBytes(") + assert.NotContains(t, content, "ImmutableString(") + assert.Contains(t, content, "utils.Trim(") + assert.Contains(t, content, "utils.TrimRight(") + assert.Contains(t, content, "utils.TrimLeft(") + assert.Contains(t, content, "utils.EqualFold(") + assert.Contains(t, content, "strings.Trim(") + assert.Contains(t, content, "strings.TrimRight(") + assert.Contains(t, content, "strings.TrimLeft(") + assert.Contains(t, content, "strings.EqualFold(") + assert.Contains(t, content, "utils.ToString(") + assert.Contains(t, content, "utils.CopyBytes(") + assert.Contains(t, content, "string([]byte(\"b\"))") + assert.Contains(t, buf.String(), "Migrating utils imports") } func Test_MigrateProxyTLSConfig(t *testing.T) {