From 77e7b357c7210010918d21b3929b0c4076c2d5db Mon Sep 17 00:00:00 2001 From: Marcel Link Date: Mon, 23 Jun 2025 10:30:25 +0200 Subject: [PATCH] feat: update tablewriter to v1.0.7 and refactor usage --- cmd/internal/printer/printer.go | 21 +++-- cmd/internal/printer/printer_test.go | 112 +++++++++++++-------------- go.mod | 10 ++- go.sum | 23 +++++- 4 files changed, 93 insertions(+), 73 deletions(-) diff --git a/cmd/internal/printer/printer.go b/cmd/internal/printer/printer.go index 878edd1c8d..c35dab2942 100644 --- a/cmd/internal/printer/printer.go +++ b/cmd/internal/printer/printer.go @@ -14,6 +14,7 @@ import ( "entgo.io/ent/entc/gen" "github.com/olekukonko/tablewriter" + "github.com/olekukonko/tablewriter/tw" ) // A Config controls the output of Fprint. @@ -43,12 +44,10 @@ func (p Config) node(t *gen.Type) { var ( b strings.Builder id []*gen.Field - table = tablewriter.NewWriter(&b) header = []string{"Field", "Type", "Unique", "Optional", "Nillable", "Default", "UpdateDefault", "Immutable", "StructTag", "Validators", "Comment"} + table = tablewriter.NewTable(&b, tablewriter.WithHeaderAutoFormat(tw.Off), tablewriter.WithHeader(header)) ) b.WriteString(t.Name + ":\n") - table.SetAutoFormatHeaders(false) - table.SetHeader(header) if t.ID != nil { id = append(id, t.ID) } @@ -63,14 +62,13 @@ func (p Config) node(t *gen.Type) { row[i] = fmt.Sprint(field.Interface()) } row[len(row)-1] = f.Comment() - table.Append(row) + _ = table.Append(row) } - table.Render() - table = tablewriter.NewWriter(&b) - table.SetAutoFormatHeaders(false) - table.SetHeader([]string{"Edge", "Type", "Inverse", "BackRef", "Relation", "Unique", "Optional", "Comment"}) + _ = table.Render() + table = tablewriter.NewTable(&b, tablewriter.WithHeaderAutoFormat(tw.Off), + tablewriter.WithHeader([]string{"Edge", "Type", "Inverse", "BackRef", "Relation", "Unique", "Optional", "Comment"})) for _, e := range t.Edges { - table.Append([]string{ + _ = table.Append([]string{ e.Name, e.Type.Name, strconv.FormatBool(e.IsInverse()), @@ -81,8 +79,9 @@ func (p Config) node(t *gen.Type) { e.Comment(), }) } - if table.NumLines() > 0 { - table.Render() + + if len(t.Edges) > 0 { + _ = table.Render() } io.WriteString(p, strings.ReplaceAll(b.String(), "\n", "\n\t")+"\n") } diff --git a/cmd/internal/printer/printer_test.go b/cmd/internal/printer/printer_test.go index d6284ecf55..e65b6506a2 100644 --- a/cmd/internal/printer/printer_test.go +++ b/cmd/internal/printer/printer_test.go @@ -35,14 +35,14 @@ func TestPrinter_Print(t *testing.T) { }, out: ` User: - +------------+-----------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | Field | Type | Unique | Optional | Nillable | Default | UpdateDefault | Immutable | StructTag | Validators | Comment | - +------------+-----------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | id | int | false | false | false | false | false | false | | 0 | | - | name | string | false | false | false | false | false | false | | 1 | | - | age | int | false | false | true | false | false | false | | 0 | | - | created_at | time.Time | false | false | true | false | false | true | | 0 | | - +------------+-----------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ + ┌────────────┬───────────┬────────┬──────────┬──────────┬─────────┬───────────────┬───────────┬───────────┬────────────┬─────────┐ + │ Field │ Type │ Unique │ Optional │ Nillable │ Default │ UpdateDefault │ Immutable │ StructTag │ Validators │ Comment │ + ├────────────┼───────────┼────────┼──────────┼──────────┼─────────┼───────────────┼───────────┼───────────┼────────────┼─────────┤ + │ id │ int │ false │ false │ false │ false │ false │ false │ │ 0 │ │ + │ name │ string │ false │ false │ false │ false │ false │ false │ │ 1 │ │ + │ age │ int │ false │ false │ true │ false │ false │ false │ │ 0 │ │ + │ created_at │ time.Time │ false │ false │ true │ false │ false │ true │ │ 0 │ │ + └────────────┴───────────┴────────┴──────────┴──────────┴─────────┴───────────────┴───────────┴───────────┴────────────┴─────────┘ `, }, @@ -61,17 +61,17 @@ User: }, out: ` User: - +-------+------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | Field | Type | Unique | Optional | Nillable | Default | UpdateDefault | Immutable | StructTag | Validators | Comment | - +-------+------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | id | int | false | false | false | false | false | false | | 0 | | - +-------+------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - +--------+-------+---------+---------+----------+--------+----------+---------+ - | Edge | Type | Inverse | BackRef | Relation | Unique | Optional | Comment | - +--------+-------+---------+---------+----------+--------+----------+---------+ - | groups | Group | false | | M2M | false | true | | - | spouse | User | false | | O2O | true | false | | - +--------+-------+---------+---------+----------+--------+----------+---------+ + ┌───────┬──────┬────────┬──────────┬──────────┬─────────┬───────────────┬───────────┬───────────┬────────────┬─────────┐ + │ Field │ Type │ Unique │ Optional │ Nillable │ Default │ UpdateDefault │ Immutable │ StructTag │ Validators │ Comment │ + ├───────┼──────┼────────┼──────────┼──────────┼─────────┼───────────────┼───────────┼───────────┼────────────┼─────────┤ + │ id │ int │ false │ false │ false │ false │ false │ false │ │ 0 │ │ + └───────┴──────┴────────┴──────────┴──────────┴─────────┴───────────────┴───────────┴───────────┴────────────┴─────────┘ + ┌────────┬───────┬─────────┬─────────┬──────────┬────────┬──────────┬─────────┐ + │ Edge │ Type │ Inverse │ BackRef │ Relation │ Unique │ Optional │ Comment │ + ├────────┼───────┼─────────┼─────────┼──────────┼────────┼──────────┼─────────┤ + │ groups │ Group │ false │ │ M2M │ false │ true │ │ + │ spouse │ User │ false │ │ O2O │ true │ false │ │ + └────────┴───────┴─────────┴─────────┴──────────┴────────┴──────────┴─────────┘ `, }, @@ -94,19 +94,19 @@ User: }, out: ` User: - +-------+--------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | Field | Type | Unique | Optional | Nillable | Default | UpdateDefault | Immutable | StructTag | Validators | Comment | - +-------+--------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | id | int | false | false | false | false | false | false | | 0 | | - | name | string | false | false | false | false | false | false | | 1 | | - | age | int | false | false | true | false | false | false | | 0 | | - +-------+--------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - +--------+-------+---------+---------+----------+--------+----------+---------+ - | Edge | Type | Inverse | BackRef | Relation | Unique | Optional | Comment | - +--------+-------+---------+---------+----------+--------+----------+---------+ - | groups | Group | false | | M2M | false | true | | - | spouse | User | false | | O2O | true | false | | - +--------+-------+---------+---------+----------+--------+----------+---------+ + ┌───────┬────────┬────────┬──────────┬──────────┬─────────┬───────────────┬───────────┬───────────┬────────────┬─────────┐ + │ Field │ Type │ Unique │ Optional │ Nillable │ Default │ UpdateDefault │ Immutable │ StructTag │ Validators │ Comment │ + ├───────┼────────┼────────┼──────────┼──────────┼─────────┼───────────────┼───────────┼───────────┼────────────┼─────────┤ + │ id │ int │ false │ false │ false │ false │ false │ false │ │ 0 │ │ + │ name │ string │ false │ false │ false │ false │ false │ false │ │ 1 │ │ + │ age │ int │ false │ false │ true │ false │ false │ false │ │ 0 │ │ + └───────┴────────┴────────┴──────────┴──────────┴─────────┴───────────────┴───────────┴───────────┴────────────┴─────────┘ + ┌────────┬───────┬─────────┬─────────┬──────────┬────────┬──────────┬─────────┐ + │ Edge │ Type │ Inverse │ BackRef │ Relation │ Unique │ Optional │ Comment │ + ├────────┼───────┼─────────┼─────────┼──────────┼────────┼──────────┼─────────┤ + │ groups │ Group │ false │ │ M2M │ false │ true │ │ + │ spouse │ User │ false │ │ O2O │ true │ false │ │ + └────────┴───────┴─────────┴─────────┴──────────┴────────┴──────────┴─────────┘ `, }, @@ -139,32 +139,32 @@ User: }, out: ` User: - +-------+--------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | Field | Type | Unique | Optional | Nillable | Default | UpdateDefault | Immutable | StructTag | Validators | Comment | - +-------+--------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | id | int | false | false | false | false | false | false | | 0 | | - | name | string | false | false | false | false | false | false | | 1 | | - | age | int | false | false | true | false | false | false | | 0 | | - +-------+--------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - +--------+-------+---------+---------+----------+--------+----------+---------+ - | Edge | Type | Inverse | BackRef | Relation | Unique | Optional | Comment | - +--------+-------+---------+---------+----------+--------+----------+---------+ - | groups | Group | false | | M2M | false | true | | - | spouse | User | false | | O2O | true | false | | - +--------+-------+---------+---------+----------+--------+----------+---------+ + ┌───────┬────────┬────────┬──────────┬──────────┬─────────┬───────────────┬───────────┬───────────┬────────────┬─────────┐ + │ Field │ Type │ Unique │ Optional │ Nillable │ Default │ UpdateDefault │ Immutable │ StructTag │ Validators │ Comment │ + ├───────┼────────┼────────┼──────────┼──────────┼─────────┼───────────────┼───────────┼───────────┼────────────┼─────────┤ + │ id │ int │ false │ false │ false │ false │ false │ false │ │ 0 │ │ + │ name │ string │ false │ false │ false │ false │ false │ false │ │ 1 │ │ + │ age │ int │ false │ false │ true │ false │ false │ false │ │ 0 │ │ + └───────┴────────┴────────┴──────────┴──────────┴─────────┴───────────────┴───────────┴───────────┴────────────┴─────────┘ + ┌────────┬───────┬─────────┬─────────┬──────────┬────────┬──────────┬─────────┐ + │ Edge │ Type │ Inverse │ BackRef │ Relation │ Unique │ Optional │ Comment │ + ├────────┼───────┼─────────┼─────────┼──────────┼────────┼──────────┼─────────┤ + │ groups │ Group │ false │ │ M2M │ false │ true │ │ + │ spouse │ User │ false │ │ O2O │ true │ false │ │ + └────────┴───────┴─────────┴─────────┴──────────┴────────┴──────────┴─────────┘ Group: - +-------+--------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | Field | Type | Unique | Optional | Nillable | Default | UpdateDefault | Immutable | StructTag | Validators | Comment | - +-------+--------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - | id | int | false | false | false | false | false | false | | 0 | | - | name | string | false | false | false | false | false | false | | 0 | | - +-------+--------+--------+----------+----------+---------+---------------+-----------+-----------+------------+---------+ - +-------+------+---------+---------+----------+--------+----------+---------+ - | Edge | Type | Inverse | BackRef | Relation | Unique | Optional | Comment | - +-------+------+---------+---------+----------+--------+----------+---------+ - | users | User | false | | M2M | false | true | | - +-------+------+---------+---------+----------+--------+----------+---------+ + ┌───────┬────────┬────────┬──────────┬──────────┬─────────┬───────────────┬───────────┬───────────┬────────────┬─────────┐ + │ Field │ Type │ Unique │ Optional │ Nillable │ Default │ UpdateDefault │ Immutable │ StructTag │ Validators │ Comment │ + ├───────┼────────┼────────┼──────────┼──────────┼─────────┼───────────────┼───────────┼───────────┼────────────┼─────────┤ + │ id │ int │ false │ false │ false │ false │ false │ false │ │ 0 │ │ + │ name │ string │ false │ false │ false │ false │ false │ false │ │ 0 │ │ + └───────┴────────┴────────┴──────────┴──────────┴─────────┴───────────────┴───────────┴───────────┴────────────┴─────────┘ + ┌───────┬──────┬─────────┬─────────┬──────────┬────────┬──────────┬─────────┐ + │ Edge │ Type │ Inverse │ BackRef │ Relation │ Unique │ Optional │ Comment │ + ├───────┼──────┼─────────┼─────────┼──────────┼────────┼──────────┼─────────┤ + │ users │ User │ false │ │ M2M │ false │ true │ │ + └───────┴──────┴─────────┴─────────┴──────────┴────────┴──────────┴─────────┘ `, }, diff --git a/go.mod b/go.mod index b1c671dbd4..130c56aa58 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/mattn/go-sqlite3 v1.14.17 github.com/mitchellh/mapstructure v1.5.0 github.com/modern-go/reflect2 v1.0.2 - github.com/olekukonko/tablewriter v0.0.5 + github.com/olekukonko/tablewriter v1.0.7 github.com/spf13/cobra v1.7.0 github.com/stretchr/testify v1.8.4 go.opencensus.io v0.24.0 @@ -26,16 +26,22 @@ require ( github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/bmatcuk/doublestar v1.3.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/fatih/color v1.15.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/hashicorp/hcl/v2 v2.18.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/kr/pretty v0.3.0 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/olekukonko/errors v0.0.0-20250405072817-4e6d85265da6 // indirect + github.com/olekukonko/ll v0.0.8 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect diff --git a/go.sum b/go.sum index 271feb3195..6eb1278300 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= @@ -71,8 +73,13 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= @@ -86,11 +93,17 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -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 v0.0.0-20250405072817-4e6d85265da6 h1:r3FaAI0NZK3hSmtTDrBVREhKULp8oUeqLT5Eyl2mSPo= +github.com/olekukonko/errors v0.0.0-20250405072817-4e6d85265da6/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.0.8 h1:sbGZ1Fx4QxJXEqL/6IG8GEFnYojUSQ45dJVwN2FH2fc= +github.com/olekukonko/ll v0.0.8/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= +github.com/olekukonko/tablewriter v1.0.7 h1:HCC2e3MM+2g72M81ZcJU11uciw6z/p82aEnm4/ySDGw= +github.com/olekukonko/tablewriter v1.0.7/go.mod h1:H428M+HzoUXC6JU2Abj9IT9ooRmdq9CxuDmKMtrOCMs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -142,6 +155,8 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=