From 08d3e3f0443d6bd0dd40c58394887057578bf629 Mon Sep 17 00:00:00 2001 From: Han Qiao Date: Thu, 27 Nov 2025 14:42:16 +0800 Subject: [PATCH 1/8] feat: deprecate beta channel on npm (#4537) fix: deprecate beta channel on npm --- .github/workflows/release.yml | 13 ------------- package.json | 2 +- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 80c496f64..79e7ecb69 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -60,18 +60,6 @@ jobs: env: GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} - publish: - name: Publish NPM - needs: - - fast-forward - permissions: - contents: read - id-token: write - uses: ./.github/workflows/tag-npm.yml - with: - release: ${{ needs.fast-forward.outputs.release_tag }} - secrets: inherit - compose: name: Bump self-hosted versions needs: @@ -100,7 +88,6 @@ jobs: needs: - fast-forward - commit - - publish runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 diff --git a/package.json b/package.json index 27f3470fd..60a47f336 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ }, { "name": "develop", - "channel": "beta" + "channel": "latest" } ], "plugins": [ From 598dc964935e5e9222e851bd31bfcdf97e6384a1 Mon Sep 17 00:00:00 2001 From: Qiao Han Date: Thu, 27 Nov 2025 15:25:23 +0800 Subject: [PATCH 2/8] chore: use github bot for approving PR --- .github/dependabot.yml | 14 ++++++-------- .github/workflows/api-sync.yml | 14 +++++++++----- .github/workflows/automerge.yml | 11 ++--------- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 68c3ea150..0949eb358 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,10 +6,9 @@ updates: interval: "cron" cronjob: "0 0 * * *" groups: - action-minor: - update-types: - - minor - - patch + actions-major: + patterns: + - "*" - package-ecosystem: "gomod" directories: - "/" @@ -28,10 +27,9 @@ updates: interval: "cron" cronjob: "0 0 * * *" groups: - npm-minor: - update-types: - - minor - - patch + npm-major: + patterns: + - "*" - package-ecosystem: "docker" directory: "pkg/config/templates" schedule: diff --git a/.github/workflows/api-sync.yml b/.github/workflows/api-sync.yml index 0295e028f..2cde09f1e 100644 --- a/.github/workflows/api-sync.yml +++ b/.github/workflows/api-sync.yml @@ -2,7 +2,8 @@ name: API Sync on: repository_dispatch: - types: [api-sync] + types: + - api-sync workflow_dispatch: # allow manual triggering # Add explicit permissions @@ -57,12 +58,15 @@ jobs: Changes were detected in the generated API code after syncing with the latest spec from infrastructure. branch: sync/api-types base: develop - labels: | - automated pr - api-sync + + - name: Approve a PR + if: steps.check.outputs.has_changes == 'true' + run: gh pr review --approve "${{ steps.cpr.outputs.pull-request-number }}" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Enable Pull Request Automerge if: steps.check.outputs.has_changes == 'true' run: gh pr merge --auto --squash "${{ steps.cpr.outputs.pull-request-number }}" env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 89933c333..1e57b0afd 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -22,19 +22,12 @@ jobs: with: github-token: "${{ secrets.GITHUB_TOKEN }}" - - name: Generate token - id: app-token - uses: actions/create-github-app-token@v2 - with: - app-id: ${{ secrets.APP_ID }} - private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} - # Here the PR gets approved. - name: Approve a PR if: ${{ steps.meta.outputs.update-type == 'version-update:semver-patch' || (!startsWith(steps.meta.outputs.previous-version, '0.') && steps.meta.outputs.update-type == 'version-update:semver-minor') }} run: gh pr review --approve "${{ github.event.pull_request.html_url }}" env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Finally, this sets the PR to allow auto-merging for patch and minor # updates if all checks pass @@ -42,4 +35,4 @@ jobs: if: ${{ steps.meta.outputs.update-type == 'version-update:semver-patch' || (!startsWith(steps.meta.outputs.previous-version, '0.') && steps.meta.outputs.update-type == 'version-update:semver-minor') }} run: gh pr merge --auto --squash "${{ github.event.pull_request.html_url }}" env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From d63fdf3a241cee92bf3801cb8b90ccfec392b4c3 Mon Sep 17 00:00:00 2001 From: Qiao Han Date: Thu, 27 Nov 2025 16:44:11 +0800 Subject: [PATCH 3/8] chore: mirror images from dependabot --- .github/workflows/automerge.yml | 25 +++++++++++++++++++++++++ .github/workflows/mirror.yml | 4 ---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 1e57b0afd..cf7432365 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -13,6 +13,8 @@ jobs: # Checking the actor will prevent your Action run failing on non-Dependabot # PRs but also ensures that it only does work for Dependabot PRs. if: ${{ github.actor == 'dependabot[bot]' }} + outputs: + docker_tags: ${{ steps.updated.outputs.dockerTags }} steps: # This first step will fail if there's no metadata and so the approval # will not occur. @@ -36,3 +38,26 @@ jobs: run: gh pr merge --auto --squash "${{ github.event.pull_request.html_url }}" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - id: updated + run: | + dockerTags=$(echo "${{ steps.meta.outputs.updated-dependencies-json }}" | jq -c \ + 'map(select(.dependencyName == "supabase/logflare"))|map("\(.dependencyName):\(.newVersion)")') + echo "dockerTags=$dockerTags" >> $GITHUB_OUTPUT + + mirror: + needs: + - dependabot + permissions: + contents: read + packages: write + id-token: write + if: ${{ needs.dependabot.outputs.docker_tags != '[]' }} + strategy: + matrix: + src: ${{ fromJson(needs.dependabot.outputs.docker_tags) }} + # Call workflow explicitly because events from actions cannot trigger more actions + uses: ./.github/workflows/mirror-image.yml + with: + image: ${{ matrix.src }} + secrets: inherit diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 27afb1292..cbe8f17b7 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -14,9 +14,6 @@ on: # mirrored yet. It's a catch-22! # # TODO: Make the cli start test run *after* we mirror images (if needed). - pull_request_review: - types: - - submitted workflow_dispatch: permissions: @@ -25,7 +22,6 @@ permissions: jobs: setup: runs-on: ubuntu-latest - if: ${{ github.event_name == 'workflow_dispatch' || github.event.review.state == 'approved' }} outputs: tags: ${{ steps.list.outputs.tags }} curr: ${{ steps.curr.outputs.tags }} From d95494ab54e3322625808ee545a0b4e4f8f0f569 Mon Sep 17 00:00:00 2001 From: Qiao Han Date: Thu, 27 Nov 2025 16:54:00 +0800 Subject: [PATCH 4/8] chore: use single quote --- .github/workflows/automerge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index cf7432365..47a827154 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -41,7 +41,7 @@ jobs: - id: updated run: | - dockerTags=$(echo "${{ steps.meta.outputs.updated-dependencies-json }}" | jq -c \ + dockerTags=$(echo '${{ steps.meta.outputs.updated-dependencies-json }}' | jq -c \ 'map(select(.dependencyName == "supabase/logflare"))|map("\(.dependencyName):\(.newVersion)")') echo "dockerTags=$dockerTags" >> $GITHUB_OUTPUT From 1bbf4970c122a22d78e8ae370eea729377a7ed22 Mon Sep 17 00:00:00 2001 From: Qiao Han Date: Thu, 27 Nov 2025 17:44:25 +0800 Subject: [PATCH 5/8] chore: replace dependabot emirror with repo dispatch --- .github/workflows/automerge.yml | 25 ------------------------- .github/workflows/mirror-image.yml | 13 +++++++------ 2 files changed, 7 insertions(+), 31 deletions(-) diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 47a827154..1e57b0afd 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -13,8 +13,6 @@ jobs: # Checking the actor will prevent your Action run failing on non-Dependabot # PRs but also ensures that it only does work for Dependabot PRs. if: ${{ github.actor == 'dependabot[bot]' }} - outputs: - docker_tags: ${{ steps.updated.outputs.dockerTags }} steps: # This first step will fail if there's no metadata and so the approval # will not occur. @@ -38,26 +36,3 @@ jobs: run: gh pr merge --auto --squash "${{ github.event.pull_request.html_url }}" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - id: updated - run: | - dockerTags=$(echo '${{ steps.meta.outputs.updated-dependencies-json }}' | jq -c \ - 'map(select(.dependencyName == "supabase/logflare"))|map("\(.dependencyName):\(.newVersion)")') - echo "dockerTags=$dockerTags" >> $GITHUB_OUTPUT - - mirror: - needs: - - dependabot - permissions: - contents: read - packages: write - id-token: write - if: ${{ needs.dependabot.outputs.docker_tags != '[]' }} - strategy: - matrix: - src: ${{ fromJson(needs.dependabot.outputs.docker_tags) }} - # Call workflow explicitly because events from actions cannot trigger more actions - uses: ./.github/workflows/mirror-image.yml - with: - image: ${{ matrix.src }} - secrets: inherit diff --git a/.github/workflows/mirror-image.yml b/.github/workflows/mirror-image.yml index 73499fe52..abf168796 100644 --- a/.github/workflows/mirror-image.yml +++ b/.github/workflows/mirror-image.yml @@ -1,6 +1,9 @@ name: Mirror Image on: + repository_dispatch: + types: + - mirror-image workflow_call: inputs: image: @@ -15,18 +18,16 @@ on: permissions: contents: read + packages: write + id-token: write jobs: mirror: runs-on: ubuntu-latest - permissions: - contents: read - packages: write - id-token: write steps: - id: strip run: | - TAG=${{ inputs.image }} + TAG=${{ github.event.client_payload.image || inputs.image }} echo "image=${TAG##*/}" >> $GITHUB_OUTPUT - name: configure aws credentials uses: aws-actions/configure-aws-credentials@v5.1.1 @@ -43,7 +44,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - uses: akhilerm/tag-push-action@v2.2.0 with: - src: docker.io/${{ inputs.image }} + src: docker.io/${{ github.event.client_payload.image || inputs.image }} dst: | public.ecr.aws/supabase/${{ steps.strip.outputs.image }} ghcr.io/supabase/${{ steps.strip.outputs.image }} From 072abe865160d54ced3eaaad145a5cdaa44fc0e1 Mon Sep 17 00:00:00 2001 From: Greg Richardson Date: Thu, 27 Nov 2025 03:00:50 -0700 Subject: [PATCH 6/8] fix: grouped pretty print status output (#4276) * feat: grouped pretty print status output * fix: re-gen openapi types * fix: lints * chore: show functions url only if enabled * chore: skip rendering group on error --------- Co-authored-by: Qiao Han --- go.mod | 4 +- go.sum | 9 +- internal/status/status.go | 189 +++++++++++++++++++++++++++++++------- internal/utils/colors.go | 4 + 4 files changed, 169 insertions(+), 37 deletions(-) diff --git a/go.mod b/go.mod index 5ce13247d..beb3211dc 100644 --- a/go.mod +++ b/go.mod @@ -39,6 +39,7 @@ require ( github.com/mithrandie/csvq-driver v1.7.0 github.com/muesli/reflow v0.3.0 github.com/oapi-codegen/nullable v1.1.0 + github.com/olekukonko/tablewriter v1.1.0 github.com/slack-go/slack v0.17.3 github.com/spf13/afero v1.15.0 github.com/spf13/cobra v1.10.1 @@ -315,7 +316,8 @@ require ( github.com/oapi-codegen/runtime v1.1.2 // indirect github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/olekukonko/errors v1.1.0 // indirect + github.com/olekukonko/ll v0.0.9 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect diff --git a/go.sum b/go.sum index c18199eef..6ad28c6de 100644 --- a/go.sum +++ b/go.sum @@ -719,7 +719,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -829,8 +828,12 @@ github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//J github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= +github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI= +github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= +github.com/olekukonko/tablewriter v1.1.0 h1:N0LHrshF4T39KvI96fn6GT8HEjXRXYNDrDjKFDB7RIY= +github.com/olekukonko/tablewriter v1.1.0/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= diff --git a/internal/status/status.go b/internal/status/status.go index ee087062b..f4770e94d 100644 --- a/internal/status/status.go +++ b/internal/status/status.go @@ -10,15 +10,16 @@ import ( "net/http" "net/url" "os" - "reflect" "slices" - "strings" "sync" "time" + "github.com/Netflix/go-env" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/go-errors/errors" + "github.com/olekukonko/tablewriter" + "github.com/olekukonko/tablewriter/tw" "github.com/spf13/afero" "github.com/supabase/cli/internal/utils" "github.com/supabase/cli/internal/utils/flags" @@ -27,9 +28,11 @@ import ( type CustomName struct { ApiURL string `env:"api.url,default=API_URL"` + RestURL string `env:"api.rest_url,default=REST_URL"` GraphqlURL string `env:"api.graphql_url,default=GRAPHQL_URL"` StorageS3URL string `env:"api.storage_s3_url,default=STORAGE_S3_URL"` McpURL string `env:"api.mcp_url,default=MCP_URL"` + FunctionsURL string `env:"api.functions_url,default=FUNCTIONS_URL"` DbURL string `env:"db.url,default=DB_URL"` StudioURL string `env:"studio.url,default=STUDIO_URL"` InbucketURL string `env:"inbucket.url,default=INBUCKET_URL,deprecated"` @@ -54,10 +57,15 @@ func (c *CustomName) toValues(exclude ...string) map[string]string { authEnabled := utils.Config.Auth.Enabled && !slices.Contains(exclude, utils.GotrueId) && !slices.Contains(exclude, utils.ShortContainerImageName(utils.Config.Auth.Image)) inbucketEnabled := utils.Config.Inbucket.Enabled && !slices.Contains(exclude, utils.InbucketId) && !slices.Contains(exclude, utils.ShortContainerImageName(utils.Config.Inbucket.Image)) storageEnabled := utils.Config.Storage.Enabled && !slices.Contains(exclude, utils.StorageId) && !slices.Contains(exclude, utils.ShortContainerImageName(utils.Config.Storage.Image)) + functionsEnabled := utils.Config.EdgeRuntime.Enabled && !slices.Contains(exclude, utils.EdgeRuntimeId) && !slices.Contains(exclude, utils.ShortContainerImageName(utils.Config.EdgeRuntime.Image)) if apiEnabled { values[c.ApiURL] = utils.Config.Api.ExternalUrl + values[c.RestURL] = utils.GetApiUrl("/rest/v1") values[c.GraphqlURL] = utils.GetApiUrl("/graphql/v1") + if functionsEnabled { + values[c.FunctionsURL] = utils.GetApiUrl("/functions/v1") + } if studioEnabled { values[c.McpURL] = utils.GetApiUrl("/mcp") } @@ -210,44 +218,159 @@ func printStatus(names CustomName, format string, w io.Writer, exclude ...string } func PrettyPrint(w io.Writer, exclude ...string) { - names := CustomName{ - ApiURL: " " + utils.Aqua("API URL"), - GraphqlURL: " " + utils.Aqua("GraphQL URL"), - StorageS3URL: " " + utils.Aqua("S3 Storage URL"), - McpURL: " " + utils.Aqua("MCP URL"), - DbURL: " " + utils.Aqua("Database URL"), - StudioURL: " " + utils.Aqua("Studio URL"), - InbucketURL: " " + utils.Aqua("Inbucket URL"), - MailpitURL: " " + utils.Aqua("Mailpit URL"), - PublishableKey: " " + utils.Aqua("Publishable key"), - SecretKey: " " + utils.Aqua("Secret key"), - JWTSecret: " " + utils.Aqua("JWT secret"), - AnonKey: " " + utils.Aqua("anon key"), - ServiceRoleKey: "" + utils.Aqua("service_role key"), - StorageS3AccessKeyId: " " + utils.Aqua("S3 Access Key"), - StorageS3SecretAccessKey: " " + utils.Aqua("S3 Secret Key"), - StorageS3Region: " " + utils.Aqua("S3 Region"), + logger := utils.GetDebugLogger() + + names := CustomName{} + if err := env.Unmarshal(env.EnvSet{}, &names); err != nil { + fmt.Fprintln(logger, err) } values := names.toValues(exclude...) - // Iterate through map in order of declared struct fields - t := reflect.TypeOf(names) - val := reflect.ValueOf(names) - for i := 0; i < val.NumField(); i++ { - k := val.Field(i).String() - if tag := t.Field(i).Tag.Get("env"); isDeprecated(tag) { + + groups := []OutputGroup{ + { + Name: "🛠️ Development Tools", + Items: []OutputItem{ + {Label: "Studio", Value: values[names.StudioURL], Type: Link}, + {Label: "Mailpit", Value: values[names.MailpitURL], Type: Link}, + {Label: "MCP", Value: values[names.McpURL], Type: Link}, + }, + }, + { + Name: "🌐 APIs", + Items: []OutputItem{ + {Label: "Project URL", Value: values[names.ApiURL], Type: Link}, + {Label: "REST", Value: values[names.RestURL], Type: Link}, + {Label: "GraphQL", Value: values[names.GraphqlURL], Type: Link}, + {Label: "Edge Functions", Value: values[names.FunctionsURL], Type: Link}, + }, + }, + { + Name: "🗄️ Database", + Items: []OutputItem{ + {Label: "URL", Value: values[names.DbURL], Type: Link}, + }, + }, + { + Name: "🔑 Authentication Keys", + Items: []OutputItem{ + {Label: "Publishable", Value: values[names.PublishableKey], Type: Key}, + {Label: "Secret", Value: values[names.SecretKey], Type: Key}, + }, + }, + { + Name: "📦 Storage (S3)", + Items: []OutputItem{ + {Label: "URL", Value: values[names.StorageS3URL], Type: Link}, + {Label: "Access Key", Value: values[names.StorageS3AccessKeyId], Type: Key}, + {Label: "Secret Key", Value: values[names.StorageS3SecretAccessKey], Type: Key}, + {Label: "Region", Value: values[names.StorageS3Region], Type: Text}, + }, + }, + } + + for _, group := range groups { + if err := group.printTable(w); err != nil { + fmt.Fprintln(logger, err) + } else { + fmt.Fprintln(w) + } + } +} + +type OutputType string + +const ( + Text OutputType = "text" + Link OutputType = "link" + Key OutputType = "key" +) + +type OutputItem struct { + Label string + Value string + Type OutputType +} + +type OutputGroup struct { + Name string + Items []OutputItem +} + +func (g *OutputGroup) printTable(w io.Writer) error { + table := tablewriter.NewTable(w, + // Rounded corners + tablewriter.WithSymbols(tw.NewSymbols(tw.StyleRounded)), + + // Table content formatting + tablewriter.WithConfig(tablewriter.Config{ + Header: tw.CellConfig{ + Formatting: tw.CellFormatting{ + AutoFormat: tw.Off, + MergeMode: tw.MergeHorizontal, + }, + Alignment: tw.CellAlignment{ + Global: tw.AlignLeft, + }, + Filter: tw.CellFilter{ + Global: func(s []string) []string { + for i := range s { + s[i] = utils.Bold(s[i]) + } + return s + }, + }, + }, + Row: tw.CellConfig{ + Alignment: tw.CellAlignment{ + Global: tw.AlignLeft, + }, + ColMaxWidths: tw.CellWidth{ + PerColumn: map[int]int{0: 16}, + }, + Filter: tw.CellFilter{ + PerColumn: []func(string) string{ + func(s string) string { + return utils.Green(s) + }, + }, + }, + }, + Behavior: tw.Behavior{ + Compact: tw.Compact{ + Merge: tw.On, + }, + }, + }), + + // Set title as header (merged across all columns) + tablewriter.WithHeader([]string{g.Name, g.Name}), + ) + + // Add data rows with values colored based on type + shouldRender := false + for _, row := range g.Items { + if row.Value == "" { continue } - if v, ok := values[k]; ok { - fmt.Fprintf(w, "%s: %s\n", k, v) + value := row.Value + switch row.Type { + case Link: + value = utils.Aqua(row.Value) + case Key: + value = utils.Yellow(row.Value) + } + if err := table.Append(row.Label, value); err != nil { + return errors.Errorf("failed to append row: %w", err) } + shouldRender = true } -} -func isDeprecated(tag string) bool { - for part := range strings.SplitSeq(tag, ",") { - if strings.EqualFold(part, "deprecated") { - return true + // Ensure at least one item in the group is non-empty + if shouldRender { + if err := table.Render(); err != nil { + return errors.Errorf("failed to render table: %w", err) } } - return false + + return nil } diff --git a/internal/utils/colors.go b/internal/utils/colors.go index ed710c4a2..f4f82652c 100644 --- a/internal/utils/colors.go +++ b/internal/utils/colors.go @@ -13,6 +13,10 @@ func Yellow(str string) string { return lipgloss.NewStyle().Foreground(lipgloss.Color("11")).Render(str) } +func Green(str string) string { + return lipgloss.NewStyle().Foreground(lipgloss.Color("10")).Render(str) +} + // For errors. func Red(str string) string { return lipgloss.NewStyle().Foreground(lipgloss.Color("9")).Render(str) From e0597a92c0d958623fa4eb01edd1af725b431dd4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 12:54:27 +0000 Subject: [PATCH 7/8] fix(docker): bump the docker-minor group across 1 directory with 4 updates (#4539) Bumps the docker-minor group with 4 updates in the /pkg/config/templates directory: supabase/studio, supabase/edge-runtime, supabase/realtime and supabase/logflare. Updates `supabase/studio` from 2025.11.25-sha-8de52c4 to 2025.11.26-sha-8f096b5 Updates `supabase/edge-runtime` from v1.69.25 to v1.69.26 Updates `supabase/realtime` from v2.65.3 to v2.66.0 Updates `supabase/logflare` from 1.26.13 to 1.26.14 --- updated-dependencies: - dependency-name: supabase/studio dependency-version: 2025.11.26-sha-8f096b5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docker-minor - dependency-name: supabase/edge-runtime dependency-version: v1.69.26 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/realtime dependency-version: v2.66.0 dependency-type: direct:production dependency-group: docker-minor - dependency-name: supabase/logflare dependency-version: 1.26.14 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: docker-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pkg/config/templates/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/config/templates/Dockerfile b/pkg/config/templates/Dockerfile index 52fbd6229..3cbcea8d3 100644 --- a/pkg/config/templates/Dockerfile +++ b/pkg/config/templates/Dockerfile @@ -5,15 +5,15 @@ FROM library/kong:2.8.1 AS kong FROM axllent/mailpit:v1.22.3 AS mailpit FROM postgrest/postgrest:v13.0.7 AS postgrest FROM supabase/postgres-meta:v0.93.1 AS pgmeta -FROM supabase/studio:2025.11.25-sha-8de52c4 AS studio +FROM supabase/studio:2025.11.26-sha-8f096b5 AS studio FROM darthsim/imgproxy:v3.8.0 AS imgproxy -FROM supabase/edge-runtime:v1.69.25 AS edgeruntime +FROM supabase/edge-runtime:v1.69.26 AS edgeruntime FROM timberio/vector:0.28.1-alpine AS vector FROM supabase/supavisor:2.7.4 AS supavisor FROM supabase/gotrue:v2.183.0 AS gotrue -FROM supabase/realtime:v2.65.3 AS realtime +FROM supabase/realtime:v2.66.1 AS realtime FROM supabase/storage-api:v1.32.0 AS storage -FROM supabase/logflare:1.26.13 AS logflare +FROM supabase/logflare:1.26.14 AS logflare # Append to JobImages when adding new dependencies below FROM supabase/pgadmin-schema-diff:cli-0.0.5 AS differ FROM supabase/migra:3.0.1663481299 AS migra From 80d5c9d8e2255db246c92d28fb904188fbdc1d13 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 00:32:22 +0000 Subject: [PATCH 8/8] chore(deps): bump the go-minor group across 1 directory with 2 updates (#4542) Bumps the go-minor group with 2 updates in the / directory: [github.com/getsentry/sentry-go](https://github.com/getsentry/sentry-go) and [github.com/olekukonko/tablewriter](https://github.com/olekukonko/tablewriter). Updates `github.com/getsentry/sentry-go` from 0.39.0 to 0.40.0 - [Release notes](https://github.com/getsentry/sentry-go/releases) - [Changelog](https://github.com/getsentry/sentry-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-go/compare/v0.39.0...v0.40.0) Updates `github.com/olekukonko/tablewriter` from 1.1.0 to 1.1.1 - [Commits](https://github.com/olekukonko/tablewriter/compare/v1.1.0...v1.1.1) --- updated-dependencies: - dependency-name: github.com/getsentry/sentry-go dependency-version: 0.40.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-minor - dependency-name: github.com/olekukonko/tablewriter dependency-version: 1.1.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++++---- go.sum | 24 ++++++++++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index beb3211dc..dc5d4a26c 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/docker/go-connections v0.6.0 github.com/docker/go-units v0.5.0 github.com/fsnotify/fsnotify v1.9.0 - github.com/getsentry/sentry-go v0.39.0 + github.com/getsentry/sentry-go v0.40.0 github.com/go-errors/errors v1.5.1 github.com/go-git/go-git/v5 v5.16.4 github.com/go-playground/validator/v10 v10.28.0 @@ -39,7 +39,7 @@ require ( github.com/mithrandie/csvq-driver v1.7.0 github.com/muesli/reflow v0.3.0 github.com/oapi-codegen/nullable v1.1.0 - github.com/olekukonko/tablewriter v1.1.0 + github.com/olekukonko/tablewriter v1.1.1 github.com/slack-go/slack v0.17.3 github.com/spf13/afero v1.15.0 github.com/spf13/cobra v1.10.1 @@ -127,6 +127,9 @@ require ( github.com/charmbracelet/x/term v0.2.1 // indirect github.com/chavacava/garif v0.1.0 // indirect github.com/ckaznocha/intrange v0.3.1 // indirect + github.com/clipperhouse/displaywidth v0.3.1 // indirect + github.com/clipperhouse/stringish v0.1.1 // indirect + github.com/clipperhouse/uax29/v2 v2.2.0 // indirect github.com/cloudflare/circl v1.6.1 // indirect github.com/containerd/console v1.0.5 // indirect github.com/containerd/containerd/api v1.9.0 // indirect @@ -272,7 +275,7 @@ require ( github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect github.com/mgechev/revive v1.9.0 // indirect github.com/microcosm-cc/bluemonday v1.0.27 // indirect @@ -316,8 +319,9 @@ require ( github.com/oapi-codegen/runtime v1.1.2 // indirect github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect + github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect github.com/olekukonko/errors v1.1.0 // indirect - github.com/olekukonko/ll v0.0.9 // indirect + github.com/olekukonko/ll v0.1.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect diff --git a/go.sum b/go.sum index 6ad28c6de..e261c2aec 100644 --- a/go.sum +++ b/go.sum @@ -190,6 +190,12 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs= github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk= +github.com/clipperhouse/displaywidth v0.3.1 h1:k07iN9gD32177o1y4O1jQMzbLdCrsGJh+blirVYybsk= +github.com/clipperhouse/displaywidth v0.3.1/go.mod h1:tgLJKKyaDOCadywag3agw4snxS5kYEuYR6Y9+qWDDYM= +github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= +github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= +github.com/clipperhouse/uax29/v2 v2.2.0 h1:ChwIKnQN3kcZteTXMgb1wztSgaU+ZemkgWdohwgs8tY= +github.com/clipperhouse/uax29/v2 v2.2.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= @@ -341,8 +347,8 @@ github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIp github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/getkin/kin-openapi v0.131.0 h1:NO2UeHnFKRYhZ8wg6Nyh5Cq7dHk4suQQr72a4pMrDxE= github.com/getkin/kin-openapi v0.131.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= -github.com/getsentry/sentry-go v0.39.0 h1:uhnexj8PNCyCve37GSqxXOeXHh4cJNLNNB4w70Jtgo0= -github.com/getsentry/sentry-go v0.39.0/go.mod h1:eRXCoh3uvmjQLY6qu63BjUZnaBu5L5WhMV1RwYO8W5s= +github.com/getsentry/sentry-go v0.40.0 h1:VTJMN9zbTvqDqPwheRVLcp0qcUcM+8eFivvGocAaSbo= +github.com/getsentry/sentry-go v0.40.0/go.mod h1:eRXCoh3uvmjQLY6qu63BjUZnaBu5L5WhMV1RwYO8W5s= github.com/ghostiam/protogetter v0.3.15 h1:1KF5sXel0HE48zh1/vn0Loiw25A9ApyseLzQuif1mLY= github.com/ghostiam/protogetter v0.3.15/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= @@ -720,8 +726,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -828,12 +834,14 @@ github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//J github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= +github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc= +github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0= github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= -github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI= -github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= -github.com/olekukonko/tablewriter v1.1.0 h1:N0LHrshF4T39KvI96fn6GT8HEjXRXYNDrDjKFDB7RIY= -github.com/olekukonko/tablewriter v1.1.0/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo= +github.com/olekukonko/ll v0.1.2 h1:lkg/k/9mlsy0SxO5aC+WEpbdT5K83ddnNhAepz7TQc0= +github.com/olekukonko/ll v0.1.2/go.mod h1:b52bVQRRPObe+yyBl0TxNfhesL0nedD4Cht0/zx55Ew= +github.com/olekukonko/tablewriter v1.1.1 h1:b3reP6GCfrHwmKkYwNRFh2rxidGHcT6cgxj/sHiDDx0= +github.com/olekukonko/tablewriter v1.1.1/go.mod h1:De/bIcTF+gpBDB3Alv3fEsZA+9unTsSzAg/ZGADCtn4= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=