diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1352fec..bc1fb8b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: hooks: - id: markdown-toc - repo: https://github.com/DavidAnson/markdownlint-cli2 - rev: v0.24.0 + rev: v0.24.1 hooks: - id: markdownlint-cli2 - repo: https://github.com/golangci/golangci-lint diff --git a/cobra.go b/cobra.go index 857ce9b..160d5f6 100644 --- a/cobra.go +++ b/cobra.go @@ -77,6 +77,7 @@ cmd := &cobra.Command{ import ( gh "github.com/mrsimonemms/golang-helpers" "github.com/spf13/cobra" + "github.com/spf13/pflag" "github.com/spf13/viper" "go.temporal.io/sdk/client" ) @@ -97,6 +98,10 @@ type TemporalOpts struct { TLSEnabled bool } +type CobraOpts struct { + Persistent bool +} + // NewCobraOpts registers the Temporal flags on cmd, binding each one to a // field of opts, and returns opts for convenience. // @@ -110,61 +115,66 @@ type TemporalOpts struct { // // The API key's default is hidden from the help output, so a key already in the // configuration is not printed to the terminal. -func NewCobraOpts(cmd *cobra.Command, opts *TemporalOpts) *TemporalOpts { +func NewCobraOpts(cmd *cobra.Command, opts *TemporalOpts, configOpts ...*CobraOpts) *TemporalOpts { + persistent := false + if len(configOpts) > 0 { + persistent = configOpts[0].Persistent + } + viper.SetDefault("health_listen_address", "0.0.0.0:3000") - cmd.Flags().StringVar( + flags(cmd, persistent).StringVar( &opts.HealthListenAddress, "health-listen-address", viper.GetString("health_listen_address"), "Address of health server. If the port is 0, a random available port is assigned.", ) viper.SetDefault("metrics_listen_address", "0.0.0.0:9090") - cmd.Flags().StringVar( + flags(cmd, persistent).StringVar( &opts.MetricsListenAddress, "metrics-listen-address", viper.GetString("metrics_listen_address"), "Address of Prometheus metrics server. If the port is 0, a random available port is assigned.", ) - cmd.Flags().StringVar( + flags(cmd, persistent).StringVar( &opts.MetricsPrefix, "metrics-prefix", viper.GetString("metrics_prefix"), "Prefix for metrics", ) viper.SetDefault("temporal_address", client.DefaultHostPort) - cmd.Flags().StringVarP( + flags(cmd, persistent).StringVarP( &opts.Address, "temporal-address", "H", viper.GetString("temporal_address"), "Address of the Temporal server", ) - cmd.Flags().StringVar( + flags(cmd, persistent).StringVar( &opts.APIKey, "temporal-api-key", viper.GetString("temporal_api_key"), "API key for Temporal authentication", ) // Hide the default value to avoid spaffing the API to command line gh.HideCommandOutput(cmd, "temporal-api-key") - cmd.Flags().StringVar( + flags(cmd, persistent).StringVar( &opts.MTLSCertPath, "tls-client-cert-path", viper.GetString("temporal_tls_client_cert_path"), "Path to mTLS client cert, usually ending in .pem", ) - cmd.Flags().StringVar( + flags(cmd, persistent).StringVar( &opts.MTLSKeyPath, "tls-client-key-path", viper.GetString("temporal_tls_client_key_path"), "Path to mTLS client key, usually ending in .key", ) viper.SetDefault("temporal_namespace", client.DefaultNamespace) - cmd.Flags().StringVarP( + flags(cmd, persistent).StringVarP( &opts.Namespace, "temporal-namespace", "n", viper.GetString("temporal_namespace"), "Temporal namespace to use", ) - cmd.Flags().StringVar( + flags(cmd, persistent).StringVar( &opts.ServerName, "temporal-server-name", viper.GetString("temporal_server_name"), "Override the TLS server name (SNI) used for certificate validation. "+ "Required when the endpoint address does not match the certificate hostname, for example AWS PrivateLink.", ) - cmd.Flags().BoolVar( + flags(cmd, persistent).BoolVar( &opts.TLSEnabled, "temporal-tls", viper.GetBool("temporal_tls"), "Enable TLS Temporal connection", ) @@ -194,3 +204,11 @@ func ParseCobraOpts(opts *TemporalOpts, overrides ...Option) []Option { ), }, overrides...) } + +func flags(cmd *cobra.Command, persistent bool) *pflag.FlagSet { + if persistent { + return cmd.PersistentFlags() + } + + return cmd.Flags() +} diff --git a/cobra_test.go b/cobra_test.go index 3e19d41..a9382a3 100644 --- a/cobra_test.go +++ b/cobra_test.go @@ -17,6 +17,8 @@ package temporal import ( + "bytes" + "io" "testing" "github.com/spf13/cobra" @@ -34,6 +36,47 @@ const ( flagServerName = "flag.sni.example.com" // flagKey is a fake Temporal API key. flagKey = "flag-api-key" + // viperKey is a fake Temporal API key supplied through Viper. It is + // distinctive so that any leak into help output is unambiguous. + viperKey = "viper-api-key-must-never-be-printed" +) + +// Command-line arguments shared by the flag parsing and inheritance tests. +const ( + childCommand = "child" + hostPortFlag = "-H" + namespaceFlag = "-n" + tlsFlag = "--temporal-tls" +) + +// Defaults applied when neither Viper nor the command line supplies a value. +const ( + defaultHealthListenAddress = "0.0.0.0:3000" + defaultMetricsListenAddress = "0.0.0.0:9090" +) + +// registrationMode is one way of calling NewCobraOpts. +type registrationMode struct { + name string + config []*CobraOpts + persistent bool +} + +var ( + defaultMode = registrationMode{name: "no config"} + persistentMode = registrationMode{name: "persistent", config: []*CobraOpts{{Persistent: true}}, persistent: true} + + // registrationModes covers every supported way of calling NewCobraOpts. + registrationModes = []registrationMode{ + defaultMode, + {name: "empty config", config: []*CobraOpts{{}}}, + {name: "persistent false", config: []*CobraOpts{{Persistent: false}}}, + persistentMode, + } + + // bothModes covers local and persistent registration, for behaviour that + // must not depend on which flag set receives the flags. + bothModes = []registrationMode{defaultMode, persistentMode} ) // resetViper isolates a test from Viper's global state, both before and after it @@ -46,38 +89,77 @@ func resetViper(t *testing.T) { } // newTestCommand returns a command with the Temporal flags registered against a -// zero-valued TemporalOpts. -func newTestCommand(t *testing.T) (*cobra.Command, *TemporalOpts) { +// zero-valued TemporalOpts. It is runnable so that its help includes the flags. +func newTestCommand(t *testing.T, configOpts ...*CobraOpts) (*cobra.Command, *TemporalOpts) { t.Helper() - cmd := &cobra.Command{Use: "test"} - opts := NewCobraOpts(cmd, &TemporalOpts{}) + cmd := &cobra.Command{Use: "test", Run: func(*cobra.Command, []string) {}} + opts := NewCobraOpts(cmd, &TemporalOpts{}, configOpts...) return cmd, opts } +// newParentAndChild returns a parent command with the Temporal flags registered +// in the given mode, and a runnable child of it. ran reports whether the child +// was executed. +func newParentAndChild(t *testing.T, mode registrationMode) (parent *cobra.Command, opts *TemporalOpts, ran *bool) { + t.Helper() + + ran = new(bool) + parent = &cobra.Command{Use: "parent", SilenceErrors: true, SilenceUsage: true} + opts = NewCobraOpts(parent, &TemporalOpts{}, mode.config...) + parent.AddCommand(&cobra.Command{ + Use: childCommand, + Run: func(*cobra.Command, []string) { *ran = true }, + }) + parent.SetOut(io.Discard) + parent.SetErr(io.Discard) + + return parent, opts, ran +} + +// registeredFlags returns the flag set NewCobraOpts is expected to register on. +// Only use it before the command executes, as Cobra then merges persistent flags +// into the local flag set. +func registeredFlags(cmd *cobra.Command, persistent bool) *pflag.FlagSet { + if persistent { + return cmd.PersistentFlags() + } + + return cmd.Flags() +} + // lookupFlag returns a registered flag, failing the test if it is missing. -func lookupFlag(t *testing.T, cmd *cobra.Command, name string) *pflag.Flag { +func lookupFlag(t *testing.T, flags *pflag.FlagSet, name string) *pflag.Flag { t.Helper() - flag := cmd.Flags().Lookup(name) + flag := flags.Lookup(name) require.NotNil(t, flag, "flag %q should be registered", name) return flag } -func TestNewCobraOptsRegistersFlags(t *testing.T) { - resetViper(t) +// renderHelp executes cmd with args followed by --help and returns the output. +func renderHelp(t *testing.T, cmd *cobra.Command, args ...string) string { + t.Helper() + + var out bytes.Buffer + cmd.SetOut(&out) + cmd.SetErr(&out) + cmd.SetArgs(append(args, "--help")) + require.NoError(t, cmd.Execute()) - cmd, _ := newTestCommand(t) + return out.String() +} +func TestNewCobraOptsRegistersFlags(t *testing.T) { tests := []struct { flag string shorthand string defValue string }{ - {flag: "health-listen-address", defValue: "0.0.0.0:3000"}, - {flag: "metrics-listen-address", defValue: "0.0.0.0:9090"}, + {flag: "health-listen-address", defValue: defaultHealthListenAddress}, + {flag: "metrics-listen-address", defValue: defaultMetricsListenAddress}, {flag: "metrics-prefix", defValue: ""}, {flag: "temporal-address", shorthand: "H", defValue: client.DefaultHostPort}, {flag: "temporal-api-key", defValue: ""}, @@ -88,83 +170,108 @@ func TestNewCobraOptsRegistersFlags(t *testing.T) { {flag: "temporal-tls", defValue: "false"}, } - for _, test := range tests { - t.Run(test.flag, func(t *testing.T) { - flag := lookupFlag(t, cmd, test.flag) + for _, mode := range registrationModes { + t.Run(mode.name, func(t *testing.T) { + resetViper(t) + + // Inspect the flag sets before execution, as Cobra merges + // persistent flags into the local set when the command runs. + cmd, _ := newTestCommand(t, mode.config...) + flags := registeredFlags(cmd, mode.persistent) + + for _, test := range tests { + t.Run(test.flag, func(t *testing.T) { + flag := lookupFlag(t, flags, test.flag) + + assert.Equal(t, test.shorthand, flag.Shorthand) + assert.Equal(t, test.defValue, flag.DefValue) + assert.NotEmpty(t, flag.Usage, "flag should be documented") + }) + } - assert.Equal(t, test.shorthand, flag.Shorthand) - assert.Equal(t, test.defValue, flag.DefValue) - assert.NotEmpty(t, flag.Usage, "flag should be documented") + assert.Equal(t, len(tests), countFlags(flags), "no unexpected flags should be registered") + assert.Zero(t, countFlags(registeredFlags(cmd, !mode.persistent)), "flags should only be registered on one flag set") }) } - - assert.Equal(t, len(tests), countFlags(cmd), "no unexpected flags should be registered") } -// countFlags returns the number of flags registered on the command. -func countFlags(cmd *cobra.Command) int { +// countFlags returns the number of flags in the flag set. +func countFlags(flags *pflag.FlagSet) int { count := 0 - cmd.Flags().VisitAll(func(*pflag.Flag) { count++ }) + flags.VisitAll(func(*pflag.Flag) { count++ }) return count } func TestNewCobraOptsDefaults(t *testing.T) { - resetViper(t) + for _, mode := range bothModes { + t.Run(mode.name, func(t *testing.T) { + resetViper(t) - _, opts := newTestCommand(t) + _, opts := newTestCommand(t, mode.config...) - assert.Equal(t, &TemporalOpts{ - Address: client.DefaultHostPort, - HealthListenAddress: "0.0.0.0:3000", - MetricsListenAddress: "0.0.0.0:9090", - Namespace: client.DefaultNamespace, - }, opts) + assert.Equal(t, &TemporalOpts{ + Address: client.DefaultHostPort, + HealthListenAddress: defaultHealthListenAddress, + MetricsListenAddress: defaultMetricsListenAddress, + Namespace: client.DefaultNamespace, + }, opts) + }) + } } func TestNewCobraOptsReturnsTheSuppliedStruct(t *testing.T) { - resetViper(t) + for _, mode := range registrationModes { + t.Run(mode.name, func(t *testing.T) { + resetViper(t) - cmd := &cobra.Command{Use: "test"} - in := &TemporalOpts{} + cmd := &cobra.Command{Use: "test"} + in := &TemporalOpts{} - out := NewCobraOpts(cmd, in) + out := NewCobraOpts(cmd, in, mode.config...) - assert.Same(t, in, out) + assert.Same(t, in, out) + }) + } } func TestNewCobraOptsUsesViperValues(t *testing.T) { - resetViper(t) - - viper.Set("health_listen_address", "127.0.0.1:1234") - viper.Set("metrics_listen_address", "127.0.0.1:5678") - viper.Set("metrics_prefix", "my_prefix") - viper.Set("temporal_address", testHostPort) - viper.Set("temporal_api_key", testKey) - viper.Set("temporal_tls_client_cert_path", "/certs/client.pem") - viper.Set("temporal_tls_client_key_path", "/certs/client.key") - viper.Set("temporal_namespace", testNamespace) - viper.Set("temporal_server_name", testServerName) - viper.Set("temporal_tls", true) - - cmd, opts := newTestCommand(t) + for _, mode := range bothModes { + t.Run(mode.name, func(t *testing.T) { + resetViper(t) - assert.Equal(t, &TemporalOpts{ - Address: testHostPort, - APIKey: testKey, - HealthListenAddress: "127.0.0.1:1234", - MetricsListenAddress: "127.0.0.1:5678", - MetricsPrefix: "my_prefix", - MTLSCertPath: "/certs/client.pem", - MTLSKeyPath: "/certs/client.key", - Namespace: testNamespace, - ServerName: testServerName, - TLSEnabled: true, - }, opts) - - // Viper values become the flag defaults too, so `--help` reflects them. - assert.Equal(t, testHostPort, lookupFlag(t, cmd, "temporal-address").DefValue) - assert.Equal(t, "true", lookupFlag(t, cmd, "temporal-tls").DefValue) + viper.Set("health_listen_address", "127.0.0.1:1234") + viper.Set("metrics_listen_address", "127.0.0.1:5678") + viper.Set("metrics_prefix", "my_prefix") + viper.Set("temporal_address", testHostPort) + viper.Set("temporal_api_key", testKey) + viper.Set("temporal_tls_client_cert_path", "/certs/client.pem") + viper.Set("temporal_tls_client_key_path", "/certs/client.key") + viper.Set("temporal_namespace", testNamespace) + viper.Set("temporal_server_name", testServerName) + viper.Set("temporal_tls", true) + + cmd, opts := newTestCommand(t, mode.config...) + + assert.Equal(t, &TemporalOpts{ + Address: testHostPort, + APIKey: testKey, + HealthListenAddress: "127.0.0.1:1234", + MetricsListenAddress: "127.0.0.1:5678", + MetricsPrefix: "my_prefix", + MTLSCertPath: "/certs/client.pem", + MTLSKeyPath: "/certs/client.key", + Namespace: testNamespace, + ServerName: testServerName, + TLSEnabled: true, + }, opts) + + // Viper values become the flag defaults too, so `--help` reflects them. + flags := registeredFlags(cmd, mode.persistent) + assert.Equal(t, testHostPort, lookupFlag(t, flags, "temporal-address").DefValue) + assert.Equal(t, "true", lookupFlag(t, flags, "temporal-tls").DefValue) + }) + } } func TestNewCobraOptsHidesTheAPIKeyDefault(t *testing.T) { @@ -180,63 +287,179 @@ func TestNewCobraOptsHidesTheAPIKeyDefault(t *testing.T) { }, { name: "api key configured", - apiKey: "super-secret", + apiKey: viperKey, expectedDefValue: "***", }, } + for _, mode := range bothModes { + for _, test := range tests { + t.Run(mode.name+"/"+test.name, func(t *testing.T) { + resetViper(t) + + if test.apiKey != "" { + viper.Set("temporal_api_key", test.apiKey) + } + + cmd, opts := newTestCommand(t, mode.config...) + + flag := lookupFlag(t, registeredFlags(cmd, mode.persistent), "temporal-api-key") + + assert.Equal(t, test.expectedDefValue, flag.DefValue) + assert.Equal(t, test.apiKey, opts.APIKey, "the value itself is still available to the program") + + help := renderHelp(t, cmd) + assert.Contains(t, help, "--temporal-api-key", "the flag should remain discoverable") + + if test.apiKey != "" { + assert.NotContains(t, help, test.apiKey, "the api key should never be printed") + } + }) + } + } +} + +func TestNewCobraOptsHidesTheAPIKeyFromInheritedHelp(t *testing.T) { + resetViper(t) + + viper.Set("temporal_api_key", viperKey) + + parent, opts, _ := newParentAndChild(t, persistentMode) + + help := renderHelp(t, parent, childCommand) + + assert.Contains(t, help, "--temporal-api-key", "the inherited flag should remain discoverable") + assert.NotContains(t, help, viperKey, "the api key should never be printed") + assert.Equal(t, viperKey, opts.APIKey, "the value itself is still available to the program") +} + +func TestNewCobraOptsFlagParsing(t *testing.T) { + for _, mode := range bothModes { + t.Run(mode.name, func(t *testing.T) { + resetViper(t) + + // Explicit flags should win over Viper-provided defaults. + viper.Set("temporal_namespace", testNamespace) + + cmd, opts := newTestCommand(t, mode.config...) + + require.NoError(t, cmd.ParseFlags([]string{ + "--health-listen-address", "127.0.0.1:1", + "--metrics-listen-address", "127.0.0.1:2", + "--metrics-prefix", "prefix", + hostPortFlag, flagHostPort, + "--temporal-api-key", flagKey, + "--tls-client-cert-path", "/flag/client.pem", + "--tls-client-key-path", "/flag/client.key", + namespaceFlag, flagNamespace, + "--temporal-server-name", flagServerName, + tlsFlag, + })) + + assert.Equal(t, &TemporalOpts{ + Address: flagHostPort, + APIKey: flagKey, + HealthListenAddress: "127.0.0.1:1", + MetricsListenAddress: "127.0.0.1:2", + MetricsPrefix: "prefix", + MTLSCertPath: "/flag/client.pem", + MTLSKeyPath: "/flag/client.key", + Namespace: flagNamespace, + ServerName: flagServerName, + TLSEnabled: true, + }, opts) + }) + } +} + +// TestNewCobraOptsPersistentFlagsAreInherited executes a child command to prove +// that flags registered persistently on its parent are usable from the child. +func TestNewCobraOptsPersistentFlagsAreInherited(t *testing.T) { + defaults := TemporalOpts{ + Address: client.DefaultHostPort, + HealthListenAddress: defaultHealthListenAddress, + MetricsListenAddress: defaultMetricsListenAddress, + Namespace: client.DefaultNamespace, + } + + tests := []struct { + name string + viper map[string]any + args []string + expected func(o *TemporalOpts) + }{ + { + name: "defaults", + args: []string{childCommand}, + expected: func(*TemporalOpts) {}, + }, + { + name: "viper values", + viper: map[string]any{"temporal_namespace": testNamespace, "temporal_tls": true}, + args: []string{childCommand}, + expected: func(o *TemporalOpts) { + o.Namespace = testNamespace + o.TLSEnabled = true + }, + }, + { + name: "long string and boolean flags", + args: []string{childCommand, "--temporal-address", flagHostPort, "--temporal-api-key=" + flagKey, tlsFlag}, + expected: func(o *TemporalOpts) { + o.Address = flagHostPort + o.APIKey = flagKey + o.TLSEnabled = true + }, + }, + { + name: "shorthand flags", + args: []string{childCommand, hostPortFlag, flagHostPort, namespaceFlag, flagNamespace}, + expected: func(o *TemporalOpts) { + o.Address = flagHostPort + o.Namespace = flagNamespace + }, + }, + { + name: "flags override viper values", + viper: map[string]any{"temporal_namespace": testNamespace}, + args: []string{childCommand, namespaceFlag, flagNamespace}, + expected: func(o *TemporalOpts) { + o.Namespace = flagNamespace + }, + }, + } + for _, test := range tests { t.Run(test.name, func(t *testing.T) { resetViper(t) - if test.apiKey != "" { - viper.Set("temporal_api_key", test.apiKey) + for k, v := range test.viper { + viper.Set(k, v) } - cmd, opts := newTestCommand(t) + parent, opts, ran := newParentAndChild(t, persistentMode) + parent.SetArgs(test.args) - flag := lookupFlag(t, cmd, "temporal-api-key") + require.NoError(t, parent.Execute()) - assert.Equal(t, test.expectedDefValue, flag.DefValue) - assert.Equal(t, test.apiKey, opts.APIKey, "the value itself is still available to the program") + expected := defaults + test.expected(&expected) - if test.apiKey != "" { - assert.NotContains(t, cmd.UsageString(), test.apiKey, "the api key should never be printed") - } + assert.True(t, *ran, "the child should run") + assert.Equal(t, &expected, opts) }) } } -func TestNewCobraOptsFlagParsing(t *testing.T) { +func TestNewCobraOptsLocalFlagsAreNotInherited(t *testing.T) { resetViper(t) - cmd, opts := newTestCommand(t) - - require.NoError(t, cmd.ParseFlags([]string{ - "--health-listen-address", "127.0.0.1:1", - "--metrics-listen-address", "127.0.0.1:2", - "--metrics-prefix", "prefix", - "-H", flagHostPort, - "--temporal-api-key", flagKey, - "--tls-client-cert-path", "/flag/client.pem", - "--tls-client-key-path", "/flag/client.key", - "-n", flagNamespace, - "--temporal-server-name", flagServerName, - "--temporal-tls", - })) + parent, opts, ran := newParentAndChild(t, defaultMode) + parent.SetArgs([]string{childCommand, namespaceFlag, flagNamespace}) - assert.Equal(t, &TemporalOpts{ - Address: flagHostPort, - APIKey: flagKey, - HealthListenAddress: "127.0.0.1:1", - MetricsListenAddress: "127.0.0.1:2", - MetricsPrefix: "prefix", - MTLSCertPath: "/flag/client.pem", - MTLSKeyPath: "/flag/client.key", - Namespace: flagNamespace, - ServerName: flagServerName, - TLSEnabled: true, - }, opts) + require.Error(t, parent.Execute(), "the child should reject the parent's local flags") + assert.False(t, *ran, "the child should not run") + assert.Equal(t, client.DefaultNamespace, opts.Namespace) } func TestParseCobraOpts(t *testing.T) { diff --git a/go.mod b/go.mod index 55448d8..4ab7c35 100644 --- a/go.mod +++ b/go.mod @@ -4,13 +4,13 @@ go 1.26.0 require ( github.com/alicebob/miniredis/v2 v2.40.0 - github.com/aws/aws-sdk-go-v2 v1.47.8 - github.com/aws/aws-sdk-go-v2/config v1.33.16 - github.com/aws/aws-sdk-go-v2/credentials v1.20.16 - github.com/aws/aws-sdk-go-v2/service/s3 v1.114.9 + github.com/aws/aws-sdk-go-v2 v1.48.0 + github.com/aws/aws-sdk-go-v2/config v1.33.18 + github.com/aws/aws-sdk-go-v2/credentials v1.21.0 + github.com/aws/aws-sdk-go-v2/service/s3 v1.114.10 github.com/gogo/protobuf v1.3.2 github.com/google/uuid v1.6.0 - github.com/mrsimonemms/golang-helpers v0.8.3 + github.com/mrsimonemms/golang-helpers v0.8.4 github.com/prometheus/client_golang v1.25.0 github.com/redis/go-redis/v9 v9.23.0 github.com/rs/zerolog v1.35.1 @@ -20,8 +20,8 @@ require ( github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.12.1 github.com/uber-go/tally/v4 v4.1.17 - go.temporal.io/api v1.64.2 - go.temporal.io/sdk v1.50.0 + go.temporal.io/api v1.64.3 + go.temporal.io/sdk v1.51.0 go.temporal.io/sdk/contrib/aws/s3driver v0.3.0 go.temporal.io/sdk/contrib/aws/s3driver/awssdkv2 v0.3.0 go.temporal.io/sdk/contrib/envconfig v1.1.0 @@ -35,20 +35,20 @@ require ( require ( github.com/BurntSushi/toml v1.6.0 // indirect github.com/Masterminds/semver/v3 v3.5.0 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.26 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.8 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.24 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.12 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.11 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.11 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.12.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.39.4 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.44.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.51.9 // indirect - github.com/aws/smithy-go v1.28.8 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.27 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.12 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.12 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.25 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.12 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.13.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.39.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.44.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.52.0 // indirect + github.com/aws/smithy-go v1.28.9 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect @@ -67,8 +67,8 @@ require ( github.com/go-playground/validator/v10 v10.30.6 // indirect github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/gofiber/fiber/v3 v3.7.0 // indirect - github.com/gofiber/schema v1.9.3 // indirect - github.com/gofiber/utils/v2 v2.6.4 // indirect + github.com/gofiber/schema v1.9.4 // indirect + github.com/gofiber/utils/v2 v2.6.5 // indirect github.com/golang/mock v1.6.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.4 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.33.0 // indirect @@ -89,7 +89,7 @@ require ( github.com/philhofer/fwd v1.2.1 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_model v0.6.3 // indirect - github.com/prometheus/common v0.73.1 // indirect + github.com/prometheus/common v0.74.0 // indirect github.com/prometheus/procfs v0.23.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/robfig/cron v1.2.0 // indirect @@ -109,13 +109,13 @@ require ( go.uber.org/atomic v1.12.0 // indirect go.uber.org/multierr v1.10.0 // indirect go.yaml.in/yaml/v3 v3.0.6 // indirect - golang.org/x/crypto v0.58.0 // indirect + golang.org/x/crypto v0.59.0 // indirect golang.org/x/sys v0.50.0 // indirect golang.org/x/term v0.48.0 // indirect golang.org/x/text v0.44.0 // indirect golang.org/x/time v0.16.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20261104224025-d1e00e9f33ab // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20261104224025-d1e00e9f33ab // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20261110000943-09e21b237f2c // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20261110000943-09e21b237f2c // indirect google.golang.org/grpc v1.85.0 // indirect google.golang.org/protobuf v1.36.12 // indirect ) diff --git a/go.sum b/go.sum index ede5d57..75d12d0 100644 --- a/go.sum +++ b/go.sum @@ -14,42 +14,42 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/alicebob/miniredis/v2 v2.40.0 h1:6IgTQbvm2JiMYZ8yur/acNJzVjtSOWCelxXbk/LUBXc= github.com/alicebob/miniredis/v2 v2.40.0/go.mod h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aws/aws-sdk-go-v2 v1.47.8 h1:fuClo7Un+Bi0EDTnSIPWxVEoJcze+wkGzNA4Vo3jRcQ= -github.com/aws/aws-sdk-go-v2 v1.47.8/go.mod h1:I8lFSH4MGrZiw2m7miCrRYHsgpC1+HW8uiVGOiPYPcw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.26 h1:SJNA4XaM8Z09adeTHf/vME93jzl44lJV70pSawIBXac= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.26/go.mod h1:l0ME5pd2QytH8UZzETcrt90x9Bm+3TyBVeWfVEcZ82c= -github.com/aws/aws-sdk-go-v2/config v1.33.16 h1:fKRsu9Pj2IPIHzTcUdWB7JHY34q9+4XEGCy7WfZaLV4= -github.com/aws/aws-sdk-go-v2/config v1.33.16/go.mod h1:wdEdQ9RBH3fnD/vicCDUIJqv8Ck3zOpxNz8e3/NtkG8= -github.com/aws/aws-sdk-go-v2/credentials v1.20.16 h1:cqRWTY4fcctJGqZedMC1Khu4h2VsgRODUOIZwn39n3Y= -github.com/aws/aws-sdk-go-v2/credentials v1.20.16/go.mod h1:x8JgCOAnbnEVQOLVX6lOtsyTrG2EHgiRNqzku9jiVxA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.8 h1:1bCo9/cf7dlTlbrZnz7g1Bki72b5thfuzFZCjdWCfVk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.8/go.mod h1:mzPw75GydqddJpfuwYO/ZDIl6xNxKjK86apitdLmvV0= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.11 h1:LTxHSJ/rwTFfaXqi5mlKKHJOW+shFB+HQ7NrCa4OQ48= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.11/go.mod h1:GF0bVKZVQX4UeUtPmTuWZj3gw0eRCdkVhW0xFnSRLmU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.11 h1:DGUM0yztI3Zz5kePulT/mMP/gVZFGTTISUiCcqSQtT0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.11/go.mod h1:kbcdJgN9cgSzZlUqsMveDl9IfexJqOzCihXjQXTNaPk= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.11 h1:kOHCwgWFyfrz9GqnJct8knQw7Apyl3xHH+OGnome77s= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.11/go.mod h1:854cZkT2fdkdrzQklD49uzxkZnajXoelpVNgT/yk4J0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.24 h1:jGzHjc2jDx08Rji1JTBtMxuXUDG7muTEw+ExYXqFzPg= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.24/go.mod h1:uJt75pK2cEyY80F5C+DK9YkCkJWsMkJViHxLYZRHl8Y= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.12 h1:hfO8FblXX93ZKHXSCqCjehwul1EtNJa9G8iFSOiJ+6w= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.12/go.mod h1:r8Eypc7ZRNdS7BsaLBUUdcXIEuKE6cVHZJ29u+IGaIc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.11 h1:PO7Tx443ecMI00nIxDrT99DVcbeMBQ6BUtJlDMRnY24= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.11/go.mod h1:n/9RixikO12YvNomZLP8k4TgUSoEkT1W23QIrpFAPvw= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.11 h1:jNP7wZylDeSJhjc1nmjZBuG5deotp3cEYIfMazmzp+Y= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.11/go.mod h1:1US+8JBnF0xNm6GE6wM5u5ugFwSZpkd2686gMuql5tI= -github.com/aws/aws-sdk-go-v2/service/s3 v1.114.9 h1:MLHGyNy4melTyk9e63s+9QgLKCHPDJrP+1NfJhtU1g4= -github.com/aws/aws-sdk-go-v2/service/s3 v1.114.9/go.mod h1:zfUkiNK2JiYlR1/SnU8aJ8Gj1nMFLkPZ69rVLv6jWPo= -github.com/aws/aws-sdk-go-v2/service/signin v1.12.4 h1:uo84u6f6YatFOBwk3DKM+ToqgVEB0cDjHQLsfrRm44A= -github.com/aws/aws-sdk-go-v2/service/signin v1.12.4/go.mod h1:PCRJucC12nFWle7wRGhSj0cw3OKB84M0EBwTrv34dhg= -github.com/aws/aws-sdk-go-v2/service/sso v1.39.4 h1:qQ97XqrlFGRRhhrcDbeqUVeezamo1a1F7lH4HczU7EA= -github.com/aws/aws-sdk-go-v2/service/sso v1.39.4/go.mod h1:mPM3sWIm0iUGl5OWkR9cG23PRFQ0Ir6y+3Hg0lKBAAE= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.44.4 h1:tbsL9+L+1SlD2W+9RjL7wD9ZVsxel7QXdQlIWt5tEi8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.44.4/go.mod h1:3L2pKVr2e3jaz9C26RXgjBIktSW1D7S0O38LhCdsAYc= -github.com/aws/aws-sdk-go-v2/service/sts v1.51.9 h1:soG/8YBczEJwckK+e4HLt0RzfkvopGrdBjmbghG99Cc= -github.com/aws/aws-sdk-go-v2/service/sts v1.51.9/go.mod h1:We33qfrD3dQRAetZ+9qUH9w+ZjL1gwP2Qvp1YqQDdsk= -github.com/aws/smithy-go v1.28.8 h1:aEmdAq7gVCoGCnvf1NnELlu3I6D/nhqrC321FyFiQkQ= -github.com/aws/smithy-go v1.28.8/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/aws/aws-sdk-go-v2 v1.48.0 h1:tFU7EJVm7MfyaXLsXdYTZ0Vd6vwt9OljCyqq0gqk0Mc= +github.com/aws/aws-sdk-go-v2 v1.48.0/go.mod h1:oeKU5p+TQBnpeLmU42WZLWvzv+ORLn+74n4QVLnm/Z0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.27 h1:3dMP9eEmHVosFN1QiD24IJBKVY8m6iUfVYXqRCT118Q= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.27/go.mod h1:KH4PKcqtjy1m0656eqQV2v53xE04ddJzuNloEKqlHkI= +github.com/aws/aws-sdk-go-v2/config v1.33.18 h1:WC0C4jM/tewXG8DWXnoxXnusJPZTryPazqk2k/zgd2s= +github.com/aws/aws-sdk-go-v2/config v1.33.18/go.mod h1:0kRpFgsnD59mC2bbbyOTVpaZ9RnXW/pFkqlfiwbgZaU= +github.com/aws/aws-sdk-go-v2/credentials v1.21.0 h1:OViwhqeipkQzSHuO2eQDUCdLrI6r3nzGxFUyM8GqnCs= +github.com/aws/aws-sdk-go-v2/credentials v1.21.0/go.mod h1:OffaVQod3fyZzhZJyPtw11WpHPF1uIHADc+/MYlXmbA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.9 h1:oH1E0tjN0g+ZRusbX1dsuat4FJ0z05l8hWaycSbDuNc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.20.9/go.mod h1:3ZaQGigIoaS45x9HgnLZ4sP475Fs7QoxU3IsZX/J3h4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.12 h1:W0yUUzKBA8SofGQ0yZafEUuZq9UxfvijRgdc6vcRQPA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.12/go.mod h1:xwKv6vwBNdpPFOxEm/ld4IODZK2s/1ksHvdBqLfH6Gs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.12 h1:lqSi8qvAnKC1vfosImdmOsuiJLr/jdybZX5299beB6Q= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.8.12/go.mod h1:rqPQE2vqkW9YHx5+Gp55sx1wsTM4xtGQLl+TKMjxxrs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.12 h1:uvX2yaL+aMjkmnrLPPlR/zwjoKFRMoNhhJfeGjfk6qc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.5.12/go.mod h1:dicT+2eNhHHqGkxHO7LoXw3QghIUGuzgdmFqaSTopgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.25 h1:rKwkY3Z+fvt2W0msjdNs6uNewPmXzPayQ961oyuWhes= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.25/go.mod h1:dBuAadQKd1F4Q4ZOg8gnFmuSHMRE40Pe3IfFwbtC4lE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.13 h1:U5HZ8FpTr6tyvulf1nT11Nw4KG1CAsXkuQGdUrIjZ/E= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.11.13/go.mod h1:dUfvCU1NaE+b3vqNENDiJncUQW7Djl5pmgUlcjesVqk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.12 h1:wzAqMZ2O4+ij9HQqIrk+P9PBGacE0wOTuWB7Mo97//I= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.14.12/go.mod h1:/0TfyruByHsOlphzP26xDTRe2DKD0J1I1Uyy2TyP8EI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.12 h1:H0IaQayT3TLiGIHiNnleQZTbndDlx7LGZ0NWZ5mDwjA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.20.12/go.mod h1:YuJJNxaOjnknLIrscBmkLhIpnmg9LzHd25sQRKUboGU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.114.10 h1:WBJb2VxRzzKnuN94YWqZPiu5a5zc3IleFqgZnmVCyvU= +github.com/aws/aws-sdk-go-v2/service/s3 v1.114.10/go.mod h1:8NhAIBVYkVHq0hIbbzujdoou0VkKwMdG+De9e5oX6qI= +github.com/aws/aws-sdk-go-v2/service/signin v1.13.1 h1:ssrDA6AKfXEc3h0Pf4EI4vQ8sN5Zd136SrU9Tjr0XPc= +github.com/aws/aws-sdk-go-v2/service/signin v1.13.1/go.mod h1:LdwHjKqPE9VCC7sTlWcOAizZx3ZJYjmfwC/EW2tIIAE= +github.com/aws/aws-sdk-go-v2/service/sso v1.39.5 h1:ANAoa+qt3/9kXnvQVgUyxcTzhzZf4DqaBS+M2DQrELU= +github.com/aws/aws-sdk-go-v2/service/sso v1.39.5/go.mod h1:vsMi+SSR7xGQXtV430LVi49qbv/R+U+upHHSp1W/+QI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.44.5 h1:uIOBLMhef4N16WguadoHKuBy9etdz+RKTeqzchXErAI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.44.5/go.mod h1:NwWmkFLtsTVyXQpbzPOlYLwEoANkdCFjJRtrNcbg/vY= +github.com/aws/aws-sdk-go-v2/service/sts v1.52.0 h1:IaBLmJWiIEtKkjXMgMbYGZk7WKXbYA8148wCMCXq9hU= +github.com/aws/aws-sdk-go-v2/service/sts v1.52.0/go.mod h1:MG6N8U9+lY4LqchrlHPqCOSr7hyxw70XU0Et2YR3eNA= +github.com/aws/smithy-go v1.28.9 h1:zkZ058OpNX0iGTK24b+ZUEQSMc11CBA6oO7xtKZfzkY= +github.com/aws/smithy-go v1.28.9/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -124,10 +124,10 @@ github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPE github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gofiber/fiber/v3 v3.7.0 h1:aF+GfB7nP9Dd0wVsv6wmr8675v66OGfjSyoDhPmvKEo= github.com/gofiber/fiber/v3 v3.7.0/go.mod h1:7dlbpUZ789TJg4q/VfdS1UWDtB6Fl/Smk6ZYZusMpAQ= -github.com/gofiber/schema v1.9.3 h1:KbKui12hYcvv6Ht0iUCOPrFU4KnrxX4D/h74TeE9Q/E= -github.com/gofiber/schema v1.9.3/go.mod h1:TmN3rIGytK690YcZZ6BSq8OOswWcmRhLYcReauIfC68= -github.com/gofiber/utils/v2 v2.6.4 h1:VsC3hEFZXk2JO6I/+FZ1OdZzMX4COPgwwrFaDAey3+o= -github.com/gofiber/utils/v2 v2.6.4/go.mod h1:SpYvWEQlYmZzzpuSfQX0gUiPSoxpOKldiEmVDzdl8Ds= +github.com/gofiber/schema v1.9.4 h1:IVNXN2WyVHmUn/S186e/rdnGlb1LFrhZ1hjndTYvn8w= +github.com/gofiber/schema v1.9.4/go.mod h1:TmN3rIGytK690YcZZ6BSq8OOswWcmRhLYcReauIfC68= +github.com/gofiber/utils/v2 v2.6.5 h1:rU+8ao6LKi3fKOA3sEjfLv1T+2C2IwomeVmEKaqkr4A= +github.com/gofiber/utils/v2 v2.6.5/go.mod h1:OqPxdhDW7fPz0dupDanqf4e5O15IyFKy724y/EY9RI4= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -222,8 +222,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/molecule-man/go-brrr v1.3.1 h1:EwaJUzRIlp/dFmIpzq4J17CA5Zi5OHo2vOGmu09hF1w= github.com/molecule-man/go-brrr v1.3.1/go.mod h1:7ybW6/7gA3oKY45jOfVNjSJDtrr6ea4tzbsTkjmQDC4= -github.com/mrsimonemms/golang-helpers v0.8.3 h1:X7u7xOP1Psx4b9suzkN3v+uEoHqFeYTDViCnxh8wmfk= -github.com/mrsimonemms/golang-helpers v0.8.3/go.mod h1:IAhHHxAIFf0fMqIor6bNTHpueSJ4Ct/WRYJ4W69FTz8= +github.com/mrsimonemms/golang-helpers v0.8.4 h1:H6I2HIdRjQF9NSS6esTWtdqtGZOnmS4GhmwAegCbgGQ= +github.com/mrsimonemms/golang-helpers v0.8.4/go.mod h1:Jt9LYqt5m/wP3NlRcGMoo97iyt4GcFoqcDR9iTg1VnA= github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -263,8 +263,8 @@ github.com/prometheus/client_model v0.6.3/go.mod h1:gpN5P9S7Rr6Yr92PiQ+Ixvhf6JZE github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.73.1 h1:SZWh/j4AvhCdhX8jvYSnxvPxhWlC9QZkjJ+tOrEr7kU= -github.com/prometheus/common v0.73.1/go.mod h1:I9aA/Ukz9s1olOobh8KtCkU7B1mQPQsB9UvQPsUQ1Dk= +github.com/prometheus/common v0.74.0 h1:6iYW8MsYvmEnXFD9zLGgF0qmReaRhs3OMONu1c/nrLI= +github.com/prometheus/common v0.74.0/go.mod h1:i/02C+FCst5B1etKgWesNrD49n+onplJCqUCtUKkOeA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -354,11 +354,11 @@ go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqe go.shabbyrobe.org/gocovmerge v0.0.0-20230507111327-fa4f82cfbf4d h1:Ns9kd1Rwzw7t0BR8XMphenji4SmIoNZPn8zhYmaVKP8= go.shabbyrobe.org/gocovmerge v0.0.0-20230507111327-fa4f82cfbf4d/go.mod h1:92Uoe3l++MlthCm+koNi0tcUCX3anayogF0Pa/sp24k= go.temporal.io/api v1.5.0/go.mod h1:BqKxEJJYdxb5dqf0ODfzfMxh8UEQ5L3zKS51FiIYYkA= -go.temporal.io/api v1.64.2 h1:3ZWDOGYoe/koJYCdCwToTWMw66wyCKGRSFEefmHyWzg= -go.temporal.io/api v1.64.2/go.mod h1:acM0I9WPuYg8W3Pd9jOZvEgi7mRUttUQ4+e7fowKVnM= +go.temporal.io/api v1.64.3 h1:Q2oP9jVB5pSputb2j3BLAEjJsi8A2tSzMojqcSGyga0= +go.temporal.io/api v1.64.3/go.mod h1:acM0I9WPuYg8W3Pd9jOZvEgi7mRUttUQ4+e7fowKVnM= go.temporal.io/sdk v1.12.0/go.mod h1:lSp3lH1lI0TyOsus0arnO3FYvjVXBZGi/G7DjnAnm6o= -go.temporal.io/sdk v1.50.0 h1:voD61vs0hfxXOI+evJ/rMdExDYf+I+YLhoawhwf1LVU= -go.temporal.io/sdk v1.50.0/go.mod h1:xP0FulN5JJSfisESUP60LlWsrKz2tLSStGjVdk8r5cc= +go.temporal.io/sdk v1.51.0 h1:RsEghFfg91qWgNaecRgPrms9TA7iXskSzSQO2BwhJRs= +go.temporal.io/sdk v1.51.0/go.mod h1:Gj2KwnQAlMhPRSX1RoqV3Zez8Y0U+6dCGxn1sg+j9kg= go.temporal.io/sdk/contrib/aws/s3driver v0.3.0 h1:RjpvE8yNnVPevL02ufcmzfGtIc6WrHEO/MdSJrdaCd4= go.temporal.io/sdk/contrib/aws/s3driver v0.3.0/go.mod h1:7lELxZBQ51a6FEOLMTEW9zQ5bG4jiexjVaqA7oCv5tc= go.temporal.io/sdk/contrib/aws/s3driver/awssdkv2 v0.3.0 h1:Jqk5vZsdhrNNZ62ISKw6QS6MEzTx6U59Z7ontUM3vDI= @@ -382,8 +382,8 @@ go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U= go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= -go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= -go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v2 v2.4.5 h1:a5nxWvYi94DRl6QSLlTbLpVmutgx2qg8EVjnJtuFpwI= +go.yaml.in/yaml/v2 v2.4.5/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= go.yaml.in/yaml/v3 v3.0.6 h1:zcDfvjXEqTQmpjniUBLc91xYJMB2c4QOFxEF/LCEckM= go.yaml.in/yaml/v3 v3.0.6/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= @@ -391,8 +391,8 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.58.0 h1:COkYLr4k7nDI4r6QtMML2AfzeIswWHAJthLS6K/M/54= -golang.org/x/crypto v0.58.0/go.mod h1:Xh+kl5A+M0gMiWDytH2Hhr5Z7WbNCpv/eB/EFgfSk+w= +golang.org/x/crypto v0.59.0 h1:xS2jhqYbzNrpvkWP2YTDf4TJwBy3ykR03i8vFDxEc7c= +golang.org/x/crypto v0.59.0/go.mod h1:veDyUwATGs3c+vN3VfTbzViMGXeTBk3WyhBOkn+F/4U= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -495,10 +495,10 @@ google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto/googleapis/api v0.0.0-20261104224025-d1e00e9f33ab h1:n6IDWZ1RzI/NberLoLLFNrjl1H45uhc4+WYsUf5lPPc= -google.golang.org/genproto/googleapis/api v0.0.0-20261104224025-d1e00e9f33ab/go.mod h1:vHV3wJM9WZyfV7GyB+OQGq5dWVrFwCDxapPK4WlRD88= -google.golang.org/genproto/googleapis/rpc v0.0.0-20261104224025-d1e00e9f33ab h1:8sYjjefPfQ+FZEh1ZwBAqK/NifJVhOxut8nRh3SJzZM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20261104224025-d1e00e9f33ab/go.mod h1:OaIUM3+LpYcK2GXM4FTmhWoIq371Owdr+Cc7/BsYHHc= +google.golang.org/genproto/googleapis/api v0.0.0-20261110000943-09e21b237f2c h1:ofk4SEqvpf6M5VWh88xRp42IYgdVOh7gffebnDj3OqU= +google.golang.org/genproto/googleapis/api v0.0.0-20261110000943-09e21b237f2c/go.mod h1:OzYcNQzaMRKcOFRMtyLzG/cfW1SmS2eh+7UmOLLFblk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261110000943-09e21b237f2c h1:XXChExL+Tm7Ubp0x0VXUEncPLHrkXIgoVWqnxmKNbAA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261110000943-09e21b237f2c/go.mod h1:OaIUM3+LpYcK2GXM4FTmhWoIq371Owdr+Cc7/BsYHHc= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=