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..4d9668a 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(`(?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 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..350d5e2 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/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) { t.Parallel()