Skip to content

Commit c0f9c94

Browse files
committedFeb 8, 2024··
Basic Exports CRUD
Signed-off-by: R.I.Pienaar <rip@devco.net>
1 parent 8d5bf62 commit c0f9c94

File tree

5 files changed

+440
-130
lines changed

5 files changed

+440
-130
lines changed
 

‎.github/workflows/test.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ jobs:
55
test:
66
strategy:
77
matrix:
8-
go: [ "1.20", "1.21" ]
8+
go: [ "1.21", "1.22" ]
99

1010
env:
1111
GOPATH: /home/runner/work/natscli

‎cli/auth_account_command.go

+395-80
Original file line numberDiff line numberDiff line change
@@ -17,55 +17,67 @@ import (
1717
"encoding/json"
1818
"fmt"
1919
"io"
20+
"net/url"
2021
"os"
22+
"sort"
2123
"time"
2224

2325
"github.com/AlecAivazis/survey/v2"
2426
"github.com/choria-io/fisk"
2527
"github.com/dustin/go-humanize"
2628
"github.com/fatih/color"
2729
"github.com/nats-io/nats-server/v2/server"
28-
"github.com/nats-io/natscli/columns"
2930
ab "github.com/synadia-io/jwt-auth-builder.go"
3031
)
3132

3233
type authAccountCommand struct {
3334
accountName string
34-
operatorName string
35-
expiry time.Duration
35+
advertise bool
36+
advertiseIsSet bool
3637
bearerAllowed bool
37-
maxSubs int64
38-
maxConns int64
39-
maxPayloadString string
40-
maxPayload int64
41-
maxLeafnodes int64
42-
maxImports int64
43-
maxExports int64
44-
jetStream bool
38+
connTypes []string
4539
defaults bool
40+
description string
41+
descriptionIsSet bool
42+
expiry time.Duration
43+
exportName string
44+
force bool
45+
isService bool
46+
jetStream bool
47+
listNames bool
48+
locale string
4649
maxAckPending int64
47-
storeMaxString string
48-
storeMax int64
49-
storeMaxStreamString string
50-
storeMaxStream int64
51-
memMaxString string
50+
maxConns int64
51+
maxConsumers int64
52+
maxExports int64
53+
maxImports int64
54+
maxLeafnodes int64
55+
maxPayload int64
56+
maxPayloadString string
57+
maxStreams int64
58+
maxSubs int64
5259
memMax int64
53-
memMaxStreamString string
5460
memMaxStream int64
55-
streamSizeRequired bool
56-
maxStreams int64
57-
maxConsumers int64
58-
listNames bool
59-
force bool
60-
skRole string
61-
locale string
62-
connTypes []string
61+
memMaxStreamString string
62+
memMaxString string
63+
operatorName string
64+
output string
6365
pubAllow []string
6466
pubDeny []string
67+
showJWT bool
68+
skRole string
69+
storeMax int64
70+
storeMaxStream int64
71+
storeMaxStreamString string
72+
storeMaxString string
73+
streamSizeRequired bool
6574
subAllow []string
6675
subDeny []string
67-
showJWT bool
68-
output string
76+
subject string
77+
tokenPosition uint
78+
tokenRequired bool
79+
tokenRequiredIsSet bool
80+
url *url.URL
6981
}
7082

7183
func configureAuthAccountCommand(auth commandHost) {
@@ -108,29 +120,71 @@ func configureAuthAccountCommand(auth commandHost) {
108120
info.Arg("name", "Account to view").StringVar(&c.accountName)
109121
info.Flag("operator", "Operator hosting the account").StringVar(&c.operatorName)
110122

111-
edit := acct.Command("edit", "Edit account settings").Alias("update").Action(c.editAction)
123+
edit := acct.Command("edit", "Edit Account settings").Alias("update").Action(c.editAction)
112124
edit.Arg("name", "Unique name for this Account").StringVar(&c.accountName)
113125
edit.Flag("operator", "Operator to add the account to").StringVar(&c.operatorName)
114126
addCreateFlags(edit, false)
115127

116-
ls := acct.Command("ls", "List accounts").Action(c.lsAction)
128+
ls := acct.Command("ls", "List Accounts").Action(c.lsAction)
117129
ls.Arg("operator", "Operator to act on").StringVar(&c.operatorName)
118130
ls.Flag("names", "Show just the Account names").UnNegatableBoolVar(&c.listNames)
119131

120-
rm := acct.Command("rm", "Removes an account").Action(c.rmAction)
132+
rm := acct.Command("rm", "Removes an Account").Action(c.rmAction)
121133
rm.Arg("name", "Account to view").StringVar(&c.accountName)
122-
rm.Flag("operator", "Operator hosting the account").StringVar(&c.operatorName)
134+
rm.Flag("operator", "Operator hosting the Account").StringVar(&c.operatorName)
123135
rm.Flag("force", "Removes without prompting").Short('f').UnNegatableBoolVar(&c.force)
124136

125-
push := acct.Command("push", "Push the account to the NATS Resolver").Action(c.pushAction)
137+
push := acct.Command("push", "Push the Account to the NATS Resolver").Action(c.pushAction)
126138
push.Arg("name", "Account to act on").StringVar(&c.accountName)
127139
push.Flag("operator", "Operator to act on").StringVar(&c.operatorName)
128140
push.Flag("show", "Show the Account JWT before pushing").UnNegatableBoolVar(&c.showJWT)
129141

130-
query := acct.Command("query", "Pull the account from the NATS Resolver and view it").Alias("pull").Action(c.queryAction)
142+
query := acct.Command("query", "Pull the Account from the NATS Resolver and view it").Alias("pull").Action(c.queryAction)
131143
query.Arg("name", "Account to act on").Required().StringVar(&c.accountName)
132144
query.Arg("output", "Saves the JWT to a file").StringVar(&c.output)
133145

146+
// imports := acct.Command("imports", "Manage account Imports").Alias("i").Alias("imp").Alias("import")
147+
// imports.Command("ls", "List Imports").Alias("list").Action(c.importLsAction)
148+
149+
exports := acct.Command("exports", "Manage account Exports").Alias("e").Alias("exp").Alias("export")
150+
151+
expAdd := exports.Command("add", "Adds an Export").Alias("new").Alias("a").Alias("n").Action(c.exportAddAction)
152+
expAdd.Arg("name", "A unique name for the Export").Required().StringVar(&c.exportName)
153+
expAdd.Arg("subject", "The Subject to export").Required().StringVar(&c.subject)
154+
expAdd.Arg("account", "Account to act on").StringVar(&c.accountName)
155+
expAdd.Flag("operator", "Operator hosting the account").StringVar(&c.operatorName)
156+
expAdd.Flag("activation", "Requires an activation token").UnNegatableBoolVar(&c.tokenRequired)
157+
expAdd.Flag("description", "Friendly description").StringVar(&c.description)
158+
expAdd.Flag("url", "Sets a URL for further information").URLVar(&c.url)
159+
expAdd.Flag("token-position", "The position to use for the Account name").UintVar(&c.tokenPosition)
160+
expAdd.Flag("advertise", "Advertise the Export").UnNegatableBoolVar(&c.advertise)
161+
expAdd.Flag("service", "Sets the Export to be a Service rather than a Stream").UnNegatableBoolVar(&c.isService)
162+
163+
expInfo := exports.Command("info", "Show information for an Export").Alias("i").Alias("show").Alias("view").Action(c.exportInfoAction)
164+
expInfo.Arg("subject", "Export to view by subject").StringVar(&c.subject)
165+
expInfo.Arg("account", "Account to act on").StringVar(&c.accountName)
166+
expInfo.Flag("operator", "Operator hosting the account").StringVar(&c.operatorName)
167+
168+
expEdit := exports.Command("edit", "Edits an Export").Alias("update").Action(c.exportEditAction)
169+
expEdit.Arg("subject", "The Subject to export").Required().StringVar(&c.subject)
170+
expEdit.Arg("account", "Account to act on").StringVar(&c.accountName)
171+
expEdit.Flag("operator", "Operator hosting the account").StringVar(&c.operatorName)
172+
expEdit.Flag("activation", "Requires an activation token").IsSetByUser(&c.tokenRequiredIsSet).BoolVar(&c.tokenRequired)
173+
expEdit.Flag("description", "Friendly description").IsSetByUser(&c.descriptionIsSet).StringVar(&c.description)
174+
expEdit.Flag("url", "Sets a URL for further information").URLVar(&c.url)
175+
expEdit.Flag("token-position", "The position to use for the Account name").UintVar(&c.tokenPosition)
176+
expEdit.Flag("advertise", "Advertise the Export").IsSetByUser(&c.advertiseIsSet).BoolVar(&c.advertise)
177+
178+
expLs := exports.Command("ls", "List Exports").Alias("list").Action(c.exportLsAction)
179+
expLs.Arg("account", "Account to act on").StringVar(&c.accountName)
180+
expLs.Flag("operator", "Operator to act on").StringVar(&c.operatorName)
181+
182+
expRm := exports.Command("rm", "Removes an Export").Action(c.exportRmAction)
183+
expRm.Arg("subject", "Export to remove by subject").StringVar(&c.subject)
184+
expRm.Arg("account", "Account to act on").StringVar(&c.accountName)
185+
expRm.Flag("operator", "Operator hosting the account").StringVar(&c.operatorName)
186+
expRm.Flag("force", "Removes without prompting").Short('f').UnNegatableBoolVar(&c.force)
187+
134188
sk := acct.Command("keys", "Manage Scoped Signing Keys").Alias("sk").Alias("s")
135189

136190
skadd := sk.Command("add", "Adds a signing key").Alias("new").Alias("a").Alias("n").Action(c.skAddAction)
@@ -147,12 +201,12 @@ func configureAuthAccountCommand(auth commandHost) {
147201
skadd.Flag("sub-allow", "Sets subjects where subscribing is allowed").StringsVar(&c.subAllow)
148202
skadd.Flag("sub-deny", "Sets subjects where subscribing is allowed").StringsVar(&c.subDeny)
149203

150-
skInfo := sk.Command("info", "Show information for a Scoped Signing Key").Action(c.skInfoAction)
204+
skInfo := sk.Command("info", "Show information for a Scoped Signing Key").Alias("i").Alias("show").Alias("view").Action(c.skInfoAction)
151205
skInfo.Arg("name", "Account to view").StringVar(&c.accountName)
152206
skInfo.Arg("key", "The role or key to view").StringVar(&c.skRole)
153207
skInfo.Flag("operator", "Operator to act on").StringVar(&c.operatorName)
154208

155-
skls := sk.Command("list", "List Scoped Signing Keys").Alias("ls").Action(c.skListAction)
209+
skls := sk.Command("ls", "List Scoped Signing Keys").Alias("list").Action(c.skListAction)
156210
skls.Arg("name", "Account to act on").StringVar(&c.accountName)
157211
skls.Flag("operator", "Operator to act on").StringVar(&c.operatorName)
158212

@@ -163,6 +217,308 @@ func configureAuthAccountCommand(auth commandHost) {
163217
skrm.Flag("force", "Removes without prompting").Short('f').UnNegatableBoolVar(&c.force)
164218
}
165219

220+
func (c *authAccountCommand) findExport(account ab.Account, subject string) ab.Export {
221+
for _, exp := range account.Exports().Streams().List() {
222+
if exp.Subject() == subject {
223+
return exp
224+
}
225+
}
226+
for _, exp := range account.Exports().Services().List() {
227+
if exp.Subject() == subject {
228+
return exp
229+
}
230+
}
231+
232+
return nil
233+
}
234+
235+
func (c *authAccountCommand) exportBySubject(acct ab.Account) []ab.Export {
236+
var ret []ab.Export
237+
238+
for _, svc := range acct.Exports().Streams().List() {
239+
ret = append(ret, svc)
240+
}
241+
for _, svc := range acct.Exports().Services().List() {
242+
ret = append(ret, svc)
243+
}
244+
245+
sort.Slice(ret, func(i, j int) bool {
246+
return ret[i].Subject() < ret[j].Subject()
247+
})
248+
249+
return ret
250+
}
251+
252+
func (c *authAccountCommand) exportSubjects(export ab.Exports) []string {
253+
var known []string
254+
for _, exp := range export.Services().List() {
255+
known = append(known, exp.Subject())
256+
}
257+
for _, exp := range export.Streams().List() {
258+
known = append(known, exp.Subject())
259+
}
260+
261+
sort.Strings(known)
262+
263+
return known
264+
}
265+
266+
func (c *authAccountCommand) fShowExport(w io.Writer, exp ab.Export) error {
267+
out, err := c.showExport(exp)
268+
if err != nil {
269+
return err
270+
}
271+
272+
_, err = fmt.Fprintln(w, out)
273+
return err
274+
}
275+
276+
func (c *authAccountCommand) showExport(exp ab.Export) (string, error) {
277+
cols := newColumns("Export info for %s exporting %s", exp.Name(), exp.Subject())
278+
279+
cols.AddSectionTitle("Configuration")
280+
cols.AddRow("Name", exp.Name())
281+
cols.AddRowIfNotEmpty("Description", exp.Description())
282+
cols.AddRowIfNotEmpty("Info", exp.InfoURL())
283+
cols.AddRow("Subject", exp.Subject())
284+
cols.AddRow("Activation Required", exp.TokenRequired())
285+
cols.AddRow("Account Token Position", exp.AccountTokenPosition())
286+
cols.AddRow("Advertised", exp.IsAdvertised())
287+
288+
cols.AddSectionTitle("Revocations")
289+
290+
if len(exp.Revocations().List()) > 0 {
291+
for _, rev := range exp.Revocations().List() {
292+
cols.AddRow(rev.At().Format(time.RFC3339), rev.PublicKey())
293+
}
294+
} else {
295+
cols.Println()
296+
cols.Println("No revocations found")
297+
}
298+
299+
return cols.Render()
300+
}
301+
302+
func (c *authAccountCommand) exportRmAction(_ *fisk.ParseContext) error {
303+
auth, _, acct, err := c.selectAccount(true)
304+
if err != nil {
305+
return err
306+
}
307+
308+
exp := c.findExport(acct, c.subject)
309+
if exp == nil {
310+
return fmt.Errorf("subject %q is not exported", c.subject)
311+
}
312+
313+
if !c.force {
314+
ok, err := askConfirmation(fmt.Sprintf("Really remove the %s Export", exp.Subject()), false)
315+
if err != nil {
316+
return err
317+
}
318+
319+
if !ok {
320+
return nil
321+
}
322+
}
323+
324+
switch exp.(type) {
325+
case ab.StreamExport:
326+
_, err = acct.Exports().Streams().Delete(c.subject)
327+
fmt.Printf("Removing Stream Export for subject %q\n", c.subject)
328+
case ab.ServiceExport:
329+
_, err = acct.Exports().Services().Delete(c.subject)
330+
fmt.Printf("Removing Service Export for subject %q\n", c.subject)
331+
}
332+
if err != nil {
333+
return err
334+
}
335+
336+
return auth.Commit()
337+
}
338+
339+
func (c *authAccountCommand) exportInfoAction(_ *fisk.ParseContext) error {
340+
_, _, acct, err := c.selectAccount(true)
341+
if err != nil {
342+
return err
343+
}
344+
345+
if c.subject == "" {
346+
known := c.exportSubjects(acct.Exports())
347+
348+
if len(known) == 0 {
349+
return fmt.Errorf("no exports defined")
350+
}
351+
352+
err = askOne(&survey.Select{
353+
Message: "Select an Export",
354+
Options: known,
355+
PageSize: selectPageSize(len(known)),
356+
}, &c.subject)
357+
if err != nil {
358+
return err
359+
}
360+
}
361+
362+
if c.subject == "" {
363+
return fmt.Errorf("subject is required")
364+
}
365+
366+
exp := c.findExport(acct, c.subject)
367+
if exp == nil {
368+
return fmt.Errorf("unknown export")
369+
}
370+
371+
return c.fShowExport(os.Stdout, exp)
372+
}
373+
374+
func (c *authAccountCommand) exportEditAction(_ *fisk.ParseContext) error {
375+
auth, _, acct, err := c.selectAccount(true)
376+
if err != nil {
377+
return err
378+
}
379+
380+
exp := c.findExport(acct, c.subject)
381+
if exp == nil {
382+
return fmt.Errorf("export for subject %q not found", c.subject)
383+
}
384+
385+
if c.tokenRequiredIsSet {
386+
err = exp.SetTokenRequired(c.tokenRequired)
387+
if err != nil {
388+
return err
389+
}
390+
}
391+
392+
if c.url != nil {
393+
err = exp.SetInfoURL(c.url.String())
394+
if err != nil {
395+
return err
396+
}
397+
}
398+
399+
if c.descriptionIsSet {
400+
err = exp.SetDescription(c.description)
401+
if err != nil {
402+
return err
403+
}
404+
}
405+
406+
if c.tokenPosition > 0 {
407+
err = exp.SetAccountTokenPosition(c.tokenPosition)
408+
if err != nil {
409+
return err
410+
}
411+
}
412+
413+
if c.advertiseIsSet {
414+
err = exp.SetAdvertised(c.advertise)
415+
if err != nil {
416+
return err
417+
}
418+
}
419+
420+
err = auth.Commit()
421+
if err != nil {
422+
return err
423+
}
424+
425+
return c.fShowExport(os.Stdout, exp)
426+
}
427+
428+
func (c *authAccountCommand) exportAddAction(_ *fisk.ParseContext) error {
429+
auth, _, acct, err := c.selectAccount(true)
430+
if err != nil {
431+
return err
432+
}
433+
434+
var exp ab.Export
435+
436+
if c.isService {
437+
exp, err = ab.NewServiceExport(c.exportName, c.subject)
438+
if err != nil {
439+
return err
440+
}
441+
} else {
442+
exp, err = ab.NewStreamExport(c.exportName, c.subject)
443+
if err != nil {
444+
return err
445+
}
446+
}
447+
448+
err = exp.SetAccountTokenPosition(c.tokenPosition)
449+
if err != nil {
450+
return err
451+
}
452+
err = exp.SetAdvertised(c.advertise)
453+
if err != nil {
454+
return err
455+
}
456+
err = exp.SetDescription(c.description)
457+
if err != nil {
458+
return err
459+
}
460+
if c.url != nil {
461+
err = exp.SetInfoURL(c.url.String())
462+
if err != nil {
463+
return err
464+
}
465+
}
466+
err = exp.SetTokenRequired(c.tokenRequired)
467+
if err != nil {
468+
return err
469+
}
470+
471+
if c.isService {
472+
err = acct.Exports().Services().AddWithConfig(exp.(ab.ServiceExport))
473+
if err != nil {
474+
return err
475+
}
476+
} else {
477+
err = acct.Exports().Streams().AddWithConfig(exp.(ab.StreamExport))
478+
if err != nil {
479+
return err
480+
}
481+
}
482+
483+
err = auth.Commit()
484+
if err != nil {
485+
return err
486+
}
487+
488+
return c.fShowExport(os.Stdout, exp)
489+
}
490+
491+
func (c *authAccountCommand) exportLsAction(_ *fisk.ParseContext) error {
492+
_, _, acct, err := c.selectAccount(true)
493+
if err != nil {
494+
return err
495+
}
496+
497+
services := acct.Exports().Services().List()
498+
streams := acct.Exports().Streams().List()
499+
500+
if len(services) == 0 && len(streams) == 0 {
501+
fmt.Println("No Exports defined")
502+
return nil
503+
}
504+
505+
exports := c.exportBySubject(acct)
506+
507+
tbl := newTableWriter("Exports for account %s", acct.Name())
508+
tbl.AddHeaders("Name", "Kind", "Subject", "Activation Required", "Advertised", "Token Position", "Revocations")
509+
for _, e := range exports {
510+
switch exp := e.(type) {
511+
case ab.StreamExport:
512+
tbl.AddRow(exp.Name(), "Stream", exp.Subject(), exp.TokenRequired(), exp.IsAdvertised(), exp.AccountTokenPosition(), f(len(exp.Revocations().List())))
513+
case ab.ServiceExport:
514+
tbl.AddRow(exp.Name(), "Service", exp.Subject(), exp.TokenRequired(), exp.IsAdvertised(), exp.AccountTokenPosition(), f(len(exp.Revocations().List())))
515+
}
516+
}
517+
fmt.Println(tbl.Render())
518+
519+
return nil
520+
}
521+
166522
func (c *authAccountCommand) selectAccount(pick bool) (*ab.AuthImpl, ab.Operator, ab.Account, error) {
167523
auth, oper, acct, err := selectOperatorAccount(c.operatorName, c.accountName, pick)
168524
if err != nil {
@@ -788,6 +1144,8 @@ func (c *authAccountCommand) showAccount(operator ab.Operator, acct ab.Account)
7881144
js := limits.JetStream()
7891145
serviceExports := len(acct.Exports().Services().List())
7901146
streamExports := len(acct.Exports().Streams().List())
1147+
serviceImports := len(acct.Imports().Services().List())
1148+
streamImports := len(acct.Imports().Streams().List())
7911149

7921150
cols := newColumns("Account %s (%s)", acct.Name(), acct.Subject())
7931151

@@ -804,6 +1162,8 @@ func (c *authAccountCommand) showAccount(operator ab.Operator, acct ab.Account)
8041162
cols.AddRow("Revocations", len(acct.Revocations().List()))
8051163
cols.AddRow("Service Exports", serviceExports)
8061164
cols.AddRow("Stream Exports", streamExports)
1165+
cols.AddRow("Service Imports", serviceImports)
1166+
cols.AddRow("Stream Imports", streamImports)
8071167

8081168
cols.AddSectionTitle("Limits")
8091169
cols.AddRow("Bearer Tokens Allowed", !limits.DisallowBearerTokens())
@@ -817,51 +1177,6 @@ func (c *authAccountCommand) showAccount(operator ab.Operator, acct ab.Account)
8171177
cols.AddRowUnlimited("Imports", limits.MaxImports(), -1)
8181178
cols.AddRowUnlimited("Exports", limits.MaxExports(), -1)
8191179

820-
if serviceExports > 0 || streamExports > 0 {
821-
renderExport := func(cols *columns.Writer, export ab.Export) {
822-
revocations := len(export.Revocations().List())
823-
cols.AddRowIfNotEmpty("Name", export.Name())
824-
cols.AddRowIfNotEmpty("Description", export.Description())
825-
cols.AddRowIfNotEmpty("Information", export.InfoURL())
826-
cols.AddRowIf("Account Token Position", export.AccountTokenPosition(), export.AccountTokenPosition() > 0)
827-
cols.AddRowIf("Token Required", export.TokenRequired(), export.TokenRequired())
828-
cols.AddRowIf("Revocation", f(revocations), revocations > 0)
829-
}
830-
831-
cols.AddSectionTitle("Exports")
832-
cols.Indent(2)
833-
if serviceExports > 0 {
834-
cols.AddSectionTitle("Service Exports")
835-
for _, export := range acct.Exports().Services().List() {
836-
cols.AddSectionTitle(export.Subject())
837-
cols.Indent(4)
838-
839-
renderExport(cols, export)
840-
if export.Tracing() != nil {
841-
if export.Tracing().SamplingRate > 0 {
842-
cols.AddRow("Tracing", fmt.Sprintf("%s sampling %d%%", export.Tracing().Subject, export.Tracing().SamplingRate))
843-
} else {
844-
cols.AddRow("Tracing", export.Tracing().Subject)
845-
}
846-
}
847-
cols.Indent(2)
848-
}
849-
}
850-
851-
if streamExports > 0 {
852-
cols.AddSectionTitle("Stream Exports")
853-
for _, export := range acct.Exports().Streams().List() {
854-
cols.AddSectionTitle(export.Subject())
855-
cols.Indent(4)
856-
857-
renderExport(cols, export)
858-
cols.Indent(2)
859-
}
860-
}
861-
862-
cols.Indent(0)
863-
}
864-
8651180
if js.IsJetStreamEnabled() {
8661181
cols.Indent(2)
8671182
cols.AddSectionTitle("JetStream Limits")

‎cli/util.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,7 @@ func compactStrings(source []string) []string {
10811081
return result
10821082
}
10831083

1084-
func newTableWriter(title string) *tbl {
1084+
func newTableWriter(format string, a ...any) *tbl {
10851085
tbl := &tbl{
10861086
writer: table.NewWriter(),
10871087
}
@@ -1101,8 +1101,8 @@ func newTableWriter(title string) *tbl {
11011101
tbl.writer.Style().Format.Header = text.FormatDefault
11021102
tbl.writer.Style().Format.Footer = text.FormatDefault
11031103

1104-
if title != "" {
1105-
tbl.writer.SetTitle(title)
1104+
if format != "" {
1105+
tbl.writer.SetTitle(fmt.Sprintf(format, a...))
11061106
}
11071107

11081108
return tbl

‎go.mod

+13-14
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
module github.com/nats-io/natscli
22

3-
go 1.20
3+
go 1.21
44

55
require (
66
github.com/AlecAivazis/survey/v2 v2.3.7
77
github.com/HdrHistogram/hdrhistogram-go v1.1.2
88
github.com/choria-io/fisk v0.6.2
99
github.com/dustin/go-humanize v1.0.1
1010
github.com/emicklei/dot v1.6.1
11-
github.com/expr-lang/expr v1.15.8
11+
github.com/expr-lang/expr v1.16.0
1212
github.com/fatih/color v1.16.0
1313
github.com/ghodss/yaml v1.0.0
1414
github.com/google/go-cmp v0.6.0
1515
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
1616
github.com/gosuri/uiprogress v0.0.1
1717
github.com/guptarohit/asciigraph v0.5.6
18-
github.com/jedib0t/go-pretty/v6 v6.5.3
18+
github.com/jedib0t/go-pretty/v6 v6.5.4
1919
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
20-
github.com/klauspost/compress v1.17.5
20+
github.com/klauspost/compress v1.17.6
2121
github.com/mattn/go-isatty v0.0.20
22-
github.com/nats-io/jsm.go v0.1.1-0.20240118115416-fcaa77de81f6
22+
github.com/nats-io/jsm.go v0.1.1-0.20240208101040-8a115db14d6c
2323
github.com/nats-io/jwt/v2 v2.5.3
24-
github.com/nats-io/nats-server/v2 v2.11.0-dev.0.20240203223349-0e3dc05fe637
24+
github.com/nats-io/nats-server/v2 v2.11.0-dev.0.20240207201315-f703123c4b88
2525
github.com/nats-io/nats.go v1.32.0
2626
github.com/nats-io/nkeys v0.4.7
2727
github.com/nats-io/nuid v1.0.1
2828
github.com/prometheus/client_golang v1.18.0
2929
github.com/prometheus/common v0.46.0
3030
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1
31-
github.com/synadia-io/jwt-auth-builder.go v0.0.0-20240124210942-2c5fcc303e3b
31+
github.com/synadia-io/jwt-auth-builder.go v0.0.0-20240207150459-d022830ddff4
3232
github.com/tylertreat/hdrhistogram-writer v0.0.0-20210816161836-2e440612a39f
33-
golang.org/x/crypto v0.18.0
34-
golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3
35-
golang.org/x/term v0.16.0
33+
golang.org/x/crypto v0.19.0
34+
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3
35+
golang.org/x/term v0.17.0
3636
gopkg.in/gizak/termui.v1 v1.0.0-20151021151108-e62b5929642a
3737
gopkg.in/yaml.v3 v3.0.1
3838
)
@@ -50,10 +50,9 @@ require (
5050
github.com/nsf/termbox-go v1.1.1 // indirect
5151
github.com/prometheus/client_model v0.5.0 // indirect
5252
github.com/prometheus/procfs v0.12.0 // indirect
53-
github.com/rivo/uniseg v0.4.4 // indirect
54-
go.uber.org/automaxprocs v1.5.3 // indirect
55-
golang.org/x/net v0.20.0 // indirect
56-
golang.org/x/sys v0.16.0 // indirect
53+
github.com/rivo/uniseg v0.4.6 // indirect
54+
golang.org/x/net v0.21.0 // indirect
55+
golang.org/x/sys v0.17.0 // indirect
5756
golang.org/x/text v0.14.0 // indirect
5857
golang.org/x/time v0.5.0 // indirect
5958
google.golang.org/protobuf v1.32.0 // indirect

‎go.sum

+28-32
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
2424
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
2525
github.com/emicklei/dot v1.6.1 h1:ujpDlBkkwgWUY+qPId5IwapRW/xEoligRSYjioR6DFI=
2626
github.com/emicklei/dot v1.6.1/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
27-
github.com/expr-lang/expr v1.15.8 h1:FL8+d3rSSP4tmK9o+vKfSMqqpGL8n15pEPiHcnBpxoI=
28-
github.com/expr-lang/expr v1.15.8/go.mod h1:uCkhfG+x7fcZ5A5sXHKuQ07jGZRl6J0FCAaf2k4PtVQ=
27+
github.com/expr-lang/expr v1.16.0 h1:BQabx+PbjsL2PEQwkJ4GIn3CcuUh8flduHhJ0lHjWwE=
28+
github.com/expr-lang/expr v1.16.0/go.mod h1:uCkhfG+x7fcZ5A5sXHKuQ07jGZRl6J0FCAaf2k4PtVQ=
2929
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
3030
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
3131
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
@@ -46,16 +46,15 @@ github.com/guptarohit/asciigraph v0.5.6 h1:0tra3HEhfdj1sP/9IedrCpfSiXYTtHdCgBhBL
4646
github.com/guptarohit/asciigraph v0.5.6/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag=
4747
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
4848
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
49-
github.com/jedib0t/go-pretty/v6 v6.5.3 h1:GIXn6Er/anHTkVUoufs7ptEvxdD6KIhR7Axa2wYCPF0=
50-
github.com/jedib0t/go-pretty/v6 v6.5.3/go.mod h1:5LQIxa52oJ/DlDSLv0HEkWOFMDGoWkJb9ss5KqPpJBg=
49+
github.com/jedib0t/go-pretty/v6 v6.5.4 h1:gOGo0613MoqUcf0xCj+h/V3sHDaZasfv152G6/5l91s=
50+
github.com/jedib0t/go-pretty/v6 v6.5.4/go.mod h1:5LQIxa52oJ/DlDSLv0HEkWOFMDGoWkJb9ss5KqPpJBg=
5151
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
5252
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
5353
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
54-
github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4=
55-
github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
56-
github.com/klauspost/compress v1.17.5 h1:d4vBd+7CHydUqpFBgUEKkSdtSugf9YFmSkvUYPquI5E=
57-
github.com/klauspost/compress v1.17.5/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
54+
github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI=
55+
github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
5856
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
57+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
5958
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
6059
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
6160
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -77,16 +76,12 @@ github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA
7776
github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
7877
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
7978
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
80-
github.com/nats-io/jsm.go v0.1.1-0.20240118115416-fcaa77de81f6 h1:Ux6MzBV3LOvoGH6RRen5bXGmtlEHc+RAWKMk49zCWzo=
81-
github.com/nats-io/jsm.go v0.1.1-0.20240118115416-fcaa77de81f6/go.mod h1:ZJ2U65E3DwQDlTd8CmqnnRnN/wfo51vO0LGRB5UQ2UM=
79+
github.com/nats-io/jsm.go v0.1.1-0.20240208101040-8a115db14d6c h1:GF753FvW8qXCeeIl2+K95ZcpWqFo+FnPaqJ73bblRcA=
80+
github.com/nats-io/jsm.go v0.1.1-0.20240208101040-8a115db14d6c/go.mod h1:aEFfEUniqQ/vmTcbc8bvOkpuikTJnR4Y4WBQGTsqeYg=
8281
github.com/nats-io/jwt/v2 v2.5.3 h1:/9SWvzc6hTfamcgXJ3uYRpgj+QuY2aLNqRiqrKcrpEo=
8382
github.com/nats-io/jwt/v2 v2.5.3/go.mod h1:iysuPemFcc7p4IoYots3IuELSI4EDe9Y0bQMe+I3Bf4=
84-
github.com/nats-io/nats-server/v2 v2.10.10 h1:g1Wd64J5SGsoqWSx1qoNu9/At7a2x+jE7Qtf2XpEx/I=
85-
github.com/nats-io/nats-server/v2 v2.10.10/go.mod h1:/TE61Dos8NlwZnjzyE3ZlOnM6dgl7tf937dnf4VclrA=
86-
github.com/nats-io/nats-server/v2 v2.11.0-dev.0.20240111031832-67d41da49bb2 h1:3Pb4Jp6AiJl9htNdLO4A92Gj6j88S87OWZModvkzDrE=
87-
github.com/nats-io/nats-server/v2 v2.11.0-dev.0.20240111031832-67d41da49bb2/go.mod h1:oorGiV9j3BOLLO3ejQe+U7pfAGyPo+ppD7rpgNF6KTQ=
88-
github.com/nats-io/nats-server/v2 v2.11.0-dev.0.20240203223349-0e3dc05fe637 h1:DaQ/zAHfz/Wi/RNfIPDlwR8gh5SDh9jvhqRG+h5iUkE=
89-
github.com/nats-io/nats-server/v2 v2.11.0-dev.0.20240203223349-0e3dc05fe637/go.mod h1:/TE61Dos8NlwZnjzyE3ZlOnM6dgl7tf937dnf4VclrA=
83+
github.com/nats-io/nats-server/v2 v2.11.0-dev.0.20240207201315-f703123c4b88 h1:mQUXBh1zwlTogpLmb3F8wJC/OrJlgQ2j76LD1BVHp64=
84+
github.com/nats-io/nats-server/v2 v2.11.0-dev.0.20240207201315-f703123c4b88/go.mod h1:/TE61Dos8NlwZnjzyE3ZlOnM6dgl7tf937dnf4VclrA=
9085
github.com/nats-io/nats.go v1.32.0 h1:Bx9BZS+aXYlxW08k8Gd3yR2s73pV5XSoAQUyp1Kwvp0=
9186
github.com/nats-io/nats.go v1.32.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
9287
github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
@@ -109,34 +104,34 @@ github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1B
109104
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
110105
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
111106
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
112-
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
113-
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
107+
github.com/rivo/uniseg v0.4.6 h1:Sovz9sDSwbOz9tgUy8JpT+KgCkPYJEN/oYzlJiYTNLg=
108+
github.com/rivo/uniseg v0.4.6/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
114109
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
110+
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
115111
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4=
116112
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY=
117113
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
118114
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
119115
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
120116
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
121-
github.com/synadia-io/jwt-auth-builder.go v0.0.0-20240124210942-2c5fcc303e3b h1:eseL27MM2cWFOlMNEVW75RkhM4HP/j1c4FdVFGri/q8=
122-
github.com/synadia-io/jwt-auth-builder.go v0.0.0-20240124210942-2c5fcc303e3b/go.mod h1:xOFg06RDzcuXiex7madWNvDLM3GmJVCxrs0V2ncBLmU=
117+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
118+
github.com/synadia-io/jwt-auth-builder.go v0.0.0-20240207150459-d022830ddff4 h1:5tJBJYLYK5gfm/VVi0AlsobMA2Q5O7JTP22akaksFno=
119+
github.com/synadia-io/jwt-auth-builder.go v0.0.0-20240207150459-d022830ddff4/go.mod h1:qAcNDSdf48QK32H49Zvtkj8xwCWsUAzP+men3cuCx4o=
123120
github.com/tylertreat/hdrhistogram-writer v0.0.0-20210816161836-2e440612a39f h1:SGznmvCovewbaSgBsHgdThtWsLj5aCLX/3ZXMLd1UD0=
124121
github.com/tylertreat/hdrhistogram-writer v0.0.0-20210816161836-2e440612a39f/go.mod h1:IY84XkhrEJTdHYLNy/zObs8mXuUAp9I65VyarbPSCCY=
125122
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
126-
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
127-
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
128123
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
129124
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
130125
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
131-
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
132-
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
126+
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
127+
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
133128
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
134129
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
135130
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
136131
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
137132
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
138-
golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=
139-
golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
133+
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 h1:/RIbNt/Zr7rVhIkQhooTxCxFcdWLGIKnZA4IXNFSrvo=
134+
golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
140135
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
141136
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
142137
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -147,8 +142,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
147142
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
148143
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
149144
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
150-
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
151-
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
145+
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
146+
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
152147
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
153148
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
154149
golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -162,12 +157,12 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
162157
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
163158
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
164159
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
165-
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
166-
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
160+
golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
161+
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
167162
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
168163
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
169-
golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE=
170-
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
164+
golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
165+
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
171166
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
172167
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
173168
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
@@ -195,6 +190,7 @@ google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHh
195190
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
196191
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
197192
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
193+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
198194
gopkg.in/gizak/termui.v1 v1.0.0-20151021151108-e62b5929642a h1:3xTF5ZxN6yR6SZlNMCN7z4X633Zi87YC8FkxFsdgdM0=
199195
gopkg.in/gizak/termui.v1 v1.0.0-20151021151108-e62b5929642a/go.mod h1:An8M7oA8GI+74WiR1qJo67ptrdlb7LJLqoXspnSrMUA=
200196
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=

0 commit comments

Comments
 (0)
Please sign in to comment.