diff --git a/artifactory/commands/yarn/yarn.go b/artifactory/commands/yarn/yarn.go index c9fbb6b6..5b380cf9 100644 --- a/artifactory/commands/yarn/yarn.go +++ b/artifactory/commands/yarn/yarn.go @@ -4,9 +4,12 @@ import ( "bufio" "encoding/json" "errors" + "fmt" + "sync" + "github.com/jfrog/build-info-go/entities" + "github.com/jfrog/build-info-go/flexpack" gofrogio "github.com/jfrog/gofrog/io" - "github.com/jfrog/jfrog-cli-core/v2/common/format" "github.com/jfrog/jfrog-client-go/artifactory" "github.com/jfrog/jfrog-client-go/artifactory/services" servicesUtils "github.com/jfrog/jfrog-client-go/artifactory/services/utils" @@ -27,6 +30,7 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" "github.com/jfrog/jfrog-cli-core/v2/utils/ioutils" + "github.com/jfrog/gofrog/version" "github.com/jfrog/jfrog-client-go/auth" "github.com/jfrog/jfrog-client-go/utils/errorutils" "github.com/jfrog/jfrog-client-go/utils/log" @@ -43,6 +47,11 @@ const ( // #nosec G101 yarnNpmAuthToken = "YARN_NPM_AUTH_TOKEN" yarnNpmAlwaysAuth = "YARN_NPM_ALWAYS_AUTH" + + // maxSupportedYarnVersion is the highest major version of Yarn that is supported. + // Yarn v4 (Berry) is now fully supported. + maxSupportedYarnVersion = "4" + nextMajorYarnVersion = "5.0.0" ) type YarnCommand struct { @@ -59,6 +68,7 @@ type YarnCommand struct { serverDetails *config.ServerDetails buildConfiguration *buildUtils.BuildConfiguration buildInfoModule *build.YarnModule + useNative bool } func NewYarnCommand() *YarnCommand { @@ -75,6 +85,21 @@ func (yc *YarnCommand) SetArgs(args []string) *YarnCommand { return yc } +func (yc *YarnCommand) SetUseNative(useNative bool) *YarnCommand { + yc.useNative = useNative + return yc +} + +func (yc *YarnCommand) SetBuildConfiguration(buildConfiguration *buildUtils.BuildConfiguration) *YarnCommand { + yc.buildConfiguration = buildConfiguration + return yc +} + +func (yc *YarnCommand) SetServerDetails(serverDetails *config.ServerDetails) *YarnCommand { + yc.serverDetails = serverDetails + return yc +} + func (yc *YarnCommand) Run() (err error) { log.Info("Running Yarn...") if err = yc.validateSupportedCommand(); err != nil { @@ -82,24 +107,122 @@ func (yc *YarnCommand) Run() (err error) { return } - if err = yc.readConfigFile(); err != nil { - return + // Native mode (JFROG_RUN_NATIVE=true) is supported from yarn v4 onwards. + // v2/v3 must use the configured-registry path with a jfrog config file. + if flexpack.IsFlexPackEnabled() { + isV4, vErr := yc.isYarnV4OrAbove() + if vErr != nil { + // yarn not found in PATH or version check failed — fail fast with a clear error + // rather than silently falling back to configured-registry mode which will crash + // with a misleading "open: no such file or directory" error. + return fmt.Errorf("JFROG_RUN_NATIVE=true requires yarn in PATH: %w", vErr) + } + if isV4 { + yc.useNative = true + log.Info("Running yarn in native mode (JFROG_RUN_NATIVE=true)") + } else { + log.Warn("Native mode (JFROG_RUN_NATIVE=true) is supported from yarn v4 onwards. Falling back to configured-registry mode.") + } + } + + if yc.useNative { + return yc.runNative() + } + return yc.runWithConfiguredRegistry() +} + +// isYarnV4OrAbove returns true when the installed yarn version is v4.0.0 or above. +func (yc *YarnCommand) isYarnV4OrAbove() (bool, error) { + yarnExecPath, err := exec.LookPath("yarn") + if err != nil { + return false, err + } + cmd := exec.Command(yarnExecPath, "--version") + out, err := cmd.Output() + if err != nil { + return false, err } + v := version.NewVersion(strings.TrimSpace(string(out))) + return v.AtLeast("4.0.0"), nil +} +// runNative runs yarn using the user's own .yarnrc.yml authentication configuration. +// This mode is activated when JFROG_RUN_NATIVE=true. It skips all Artifactory auth +// configuration and .yarnrc backup/restore, trusting the user's existing setup. +// +// Dependency tree collection works the same way via `yarn info --all --recursive --json`. +// Server details for checksum collection are resolved from --server-id or the default server. +func (yc *YarnCommand) runNative() (err error) { var filteredYarnArgs []string - yc.threads, _, _, _, filteredYarnArgs, yc.buildConfiguration, err = extractYarnOptionsFromArgs(yc.yarnArgs) + yc.threads, filteredYarnArgs, yc.buildConfiguration, err = extractYarnOptionsFromArgs(yc.yarnArgs) if err != nil { - log.Debug("Error occurred while extracting yarn opts: ", err) return } + // Extract --server-id from args; if empty, GetSpecificConfig returns the default server. + filteredYarnArgs, serverID, err := coreutils.ExtractServerIdFromCommand(filteredYarnArgs) + if err != nil { + return + } + if yc.serverDetails == nil { + yc.serverDetails, err = config.GetSpecificConfig(serverID, true, true) + if err != nil { + return + } + } + if err = yc.preparePrerequisites(); err != nil { return } - err = verifyYarnVersion(yc.executablePath, filteredYarnArgs) + var missingDepsChan chan string + var missingDependencies []string + if yc.collectBuildInfo { + missingDepsChan, err = yc.prepareBuildInfo() + if err != nil { + return + } + go func() { + for depId := range missingDepsChan { + missingDependencies = append(missingDependencies, depId) + } + }() + } + + // In native mode, we use the user's own .yarnrc.yml as-is — no backup/restore needed. + yc.buildInfoModule.SetArgs(filteredYarnArgs) + if err = yc.buildInfoModule.Build(); err != nil { + if yc.collectBuildInfo { + close(missingDepsChan) + } + return + } + + if yc.collectBuildInfo { + close(missingDepsChan) + printMissingDependencies(missingDependencies) + } + + return +} + +// runWithConfiguredRegistry runs yarn after configuring the registry and auth +// from the project's jfrog config file. It sets YARN_NPM_* environment variables +// and modifies .yarnrc.yml to point at the configured Artifactory repository, +// then restores everything after the build completes. +func (yc *YarnCommand) runWithConfiguredRegistry() (err error) { + if err = yc.readConfigFile(); err != nil { + return + } + + var filteredYarnArgs []string + yc.threads, filteredYarnArgs, yc.buildConfiguration, err = extractYarnOptionsFromArgs(yc.yarnArgs) if err != nil { - return err + return + } + + if err = yc.preparePrerequisites(); err != nil { + return } var missingDepsChan chan string @@ -139,7 +262,6 @@ func (yc *YarnCommand) Run() (err error) { return } - log.Info("Yarn finished successfully.") return } @@ -164,31 +286,43 @@ func (yc *YarnCommand) validateSupportedCommand() error { return errorutils.CheckErrorf("The command 'jfrog rt yarn npm %s' is not supported.", npmCommand) } } - // validate 'yarn set version *' command - err := validateSupportedVersion(arg, yc.yarnArgs, index) - if err != nil { - return err + if arg == "set" && len(yc.yarnArgs) > index+2 && yc.yarnArgs[index+1] == "version" { + if err := validateSetVersion(yc.yarnArgs[index+2]); err != nil { + return err + } } } return nil } -// validateSupportedVersion checks if the version to be set is supported. -// currently version 4 is not supported. -func validateSupportedVersion(arg string, yarnArgs []string, index int) error { - if arg == "set" && len(yarnArgs) > index { - setCommand := yarnArgs[index+1] - if setCommand == "version" && len(yarnArgs) > index+2 { - versionCommand := yarnArgs[index+2] - err := yarn.IsVersionSupported(versionCommand) - if err != nil { - return err - } - } +// validateSetVersion checks that the requested yarn version in 'yarn set version X.Y.Z' +// does not exceed the maximum supported major version. +func validateSetVersion(setVersion string) error { + v := version.NewVersion(setVersion) + if v.AtLeast(nextMajorYarnVersion) { + return errorutils.CheckErrorf( + "Yarn version %s is not supported. The maximum supported major version is %s.", + setVersion, maxSupportedYarnVersion) } return nil } +// skipVersionCheck returns true for commands that should not trigger a yarn version +// compatibility check (e.g. 'yarn set version' or 'yarn --version'). +func skipVersionCheck(args []string) bool { + for i, arg := range args { + if arg == "--version" || arg == "-v" { + return true + } + if arg == "set" && len(args) > i+1 && args[i+1] == "version" { + return true + } + } + return false +} + + + func (yc *YarnCommand) readConfigFile() error { log.Debug("Preparing to read the config file", yc.configFilePath) vConfig, err := project.ReadConfigFile(yc.configFilePath, project.YAML) @@ -246,6 +380,11 @@ func (yc *YarnCommand) preparePrerequisites() error { yc.buildInfoModule.SetName(yc.buildConfiguration.GetModule()) } + // In native mode, the user handles auth via their own .yarnrc.yml — skip Artifactory auth setup. + if yc.useNative { + return nil + } + yc.registry, yc.npmAuthIdent, yc.npmAuthToken, err = GetYarnAuthDetails(yc.serverDetails, yc.repo) return err } @@ -298,33 +437,6 @@ func GetYarnAuthDetails(server *config.ServerDetails, repo string) (registry, np return } -func verifyYarnVersion(executablePath string, filteredYarnArgs []string) error { - if skipVersionCheck(filteredYarnArgs) { - - log.Debug("Skipping yarn version verification") - return nil - } - err := yarn.IsInstalledYarnVersionSupported(executablePath) - log.Debug("Yarn version verified") - if err != nil { - return err - } - log.Debug("Successfully verified yarn version") - return nil -} - -func skipVersionCheck(filteredYarnArgs []string) bool { - // Allow 'yarn set version' command - (this will help to downgrade and upgrade yarn version) - if len(filteredYarnArgs) >= 2 && filteredYarnArgs[0] == "set" && filteredYarnArgs[1] == "version" { - return true - } - - // Allow '--version' to check current version - if len(filteredYarnArgs) >= 1 && filteredYarnArgs[0] == "--version" { - return true - } - return false -} func setArtifactoryAuth(server *config.ServerDetails) (auth.ServiceDetails, error) { authArtDetails, err := server.CreateArtAuthConfig() @@ -384,8 +496,8 @@ func updateScopeRegistries(execPath, registry, npmAuthIdent, npmAuthToken string if err != nil { return err } - // If npmScopesStr is "undefined" it means that the npmScopes configuration does not exist in case using yarn version 4. - if npmScopesStr == "undefined" { + // Empty string means the npmScopes configuration is not set (normalised from yarn v4's "undefined" by ConfigGet). + if npmScopesStr == "" { return nil } npmScopesMap := make(map[string]yarnNpmScope) @@ -507,7 +619,7 @@ func getDependencyInfo(name, ver string, previousBuildDependencies map[string]*e return } -func extractYarnOptionsFromArgs(args []string) (threads int, detailedSummary, xrayScan bool, scanOutputFormat format.OutputFormat, cleanArgs []string, buildConfig *buildUtils.BuildConfiguration, err error) { +func extractYarnOptionsFromArgs(args []string) (threads int, cleanArgs []string, buildConfig *buildUtils.BuildConfiguration, err error) { threads = 3 // Extract threads information from the args. flagIndex, valueIndex, numOfThreads, err := coreutils.FindFlag("--threads", args) @@ -522,7 +634,7 @@ func extractYarnOptionsFromArgs(args []string) (threads int, detailedSummary, xr return } } - detailedSummary, xrayScan, scanOutputFormat, cleanArgs, buildConfig, err = commandUtils.ExtractNpmOptionsFromArgs(args) + _, _, _, cleanArgs, buildConfig, err = commandUtils.ExtractNpmOptionsFromArgs(args) return } @@ -536,7 +648,31 @@ func printMissingDependencies(missingDependencies []string) { } func createCollectChecksumsFunc(previousBuildDependencies map[string]*entities.Dependency, servicesManager artifactory.ArtifactoryServicesManager, missingDepsChan chan string) func(dependency *entities.Dependency) (bool, error) { + type cacheEntry struct { + checksum entities.Checksum + fileType string + missing bool + } + // Process-wide cache shared across all parallel workers for this build run. + // Prevents duplicate AQL calls for the same dep id (common in monorepos where + // multiple workspace modules share transitive dependencies). + var checksumCache sync.Map // id -> cacheEntry + return func(dependency *entities.Dependency) (bool, error) { + if v, ok := checksumCache.Load(dependency.Id); ok { + e, ok := v.(cacheEntry) + if !ok { + return false, nil + } + if e.missing { + // Already warned on first miss — skip channel to avoid duplicate warn entries. + return false, nil + } + dependency.Checksum = e.checksum + dependency.Type = e.fileType + return true, nil + } + splitDepId := strings.SplitN(dependency.Id, ":", 2) name := splitDepId[0] ver := splitDepId[1] @@ -544,11 +680,13 @@ func createCollectChecksumsFunc(previousBuildDependencies map[string]*entities.D // Get dependency info. checksum, fileType, err := getDependencyInfo(name, ver, previousBuildDependencies, servicesManager) if err != nil || checksum.IsEmpty() { + checksumCache.Store(dependency.Id, cacheEntry{missing: true}) missingDepsChan <- dependency.Id return false, err } - // Update dependency. + // Cache result and update dependency. + checksumCache.Store(dependency.Id, cacheEntry{checksum: checksum, fileType: fileType}) dependency.Type = fileType dependency.Checksum = checksum return true, nil diff --git a/artifactory/commands/yarn/yarn_test.go b/artifactory/commands/yarn/yarn_test.go index 3db1fad6..89433637 100644 --- a/artifactory/commands/yarn/yarn_test.go +++ b/artifactory/commands/yarn/yarn_test.go @@ -1,6 +1,8 @@ package yarn import ( + buildUtils "github.com/jfrog/jfrog-cli-core/v2/common/build" + "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-client-go/utils/tests" "github.com/stretchr/testify/assert" "os" @@ -22,8 +24,10 @@ func TestValidateSupportedCommand(t *testing.T) { {[]string{"npm", "info", "package-name"}, true}, {[]string{"npm", "whoami"}, true}, {[]string{"--version"}, true}, - {[]string{"set", "version", "4.0.1"}, false}, + {[]string{"set", "version", "4.0.1"}, true}, {[]string{"set", "version", "3.2.1"}, true}, + // Yarn v5+ is not yet supported + {[]string{"set", "version", "5.0.0"}, false}, } for _, testCase := range testCases { @@ -78,17 +82,93 @@ func TestExtractAuthValuesFromNpmAuth(t *testing.T) { func TestSkipVersionCheck(t *testing.T) { testCases := []struct { + name string args []string expected bool }{ - {[]string{"set", "version", "1.22.10"}, true}, - {[]string{"--version"}, true}, - {[]string{"install"}, false}, - {[]string{"add", "lodash"}, false}, + {"set version", []string{"set", "version", "1.22.10"}, true}, + {"long --version flag", []string{"--version"}, true}, + {"short -v flag", []string{"-v"}, true}, + {"install", []string{"install"}, false}, + {"add lodash", []string{"add", "lodash"}, false}, + {"set without version keyword", []string{"set", "resolution"}, false}, + {"set version missing value", []string{"set", "version"}, true}, + {"empty args", []string{}, false}, } for _, testCase := range testCases { - result := skipVersionCheck(testCase.args) - assert.Equal(t, testCase.expected, result, "Test args:", testCase.args) + t.Run(testCase.name, func(t *testing.T) { + result := skipVersionCheck(testCase.args) + assert.Equal(t, testCase.expected, result, "Test args:", testCase.args) + }) + } +} + +func TestValidateSetVersion(t *testing.T) { + testCases := []struct { + name string + setVersion string + expectErr bool + }{ + {"yarn v1 classic", "1.22.22", false}, + {"yarn v3", "3.6.4", false}, + {"yarn v4 latest supported major", "4.0.1", false}, + {"yarn v4 high patch", "4.9.9", false}, + {"yarn v5 unsupported", "5.0.0", true}, + {"yarn v6 unsupported", "6.1.2", true}, } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + err := validateSetVersion(testCase.setVersion) + if testCase.expectErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + }) + } +} + +func TestYarnCommandSetters(t *testing.T) { + yc := NewYarnCommand() + + // SetArgs + args := []string{"install", "--json"} + yc.SetArgs(args) + assert.Equal(t, args, yc.yarnArgs) + + // SetConfigFilePath + yc.SetConfigFilePath("/tmp/config.yaml") + assert.Equal(t, "/tmp/config.yaml", yc.configFilePath) + + // SetUseNative + assert.False(t, yc.useNative) + yc.SetUseNative(true) + assert.True(t, yc.useNative) + + // SetBuildConfiguration + bc := buildUtils.NewBuildConfiguration("my-build", "42", "my-module", "my-project") + yc.SetBuildConfiguration(bc) + assert.Equal(t, bc, yc.buildConfiguration) + + // SetServerDetails + sd := &config.ServerDetails{ServerId: "my-server", Url: "https://example.com"} + yc.SetServerDetails(sd) + assert.Equal(t, sd, yc.serverDetails) + + // ServerDetails getter + got, err := yc.ServerDetails() + assert.NoError(t, err) + assert.Equal(t, sd, got) + + // CommandName + assert.Equal(t, "rt_yarn", yc.CommandName()) +} + +func TestPrintMissingDependencies(t *testing.T) { + // Should not panic on empty or non-empty input. + assert.NotPanics(t, func() { printMissingDependencies(nil) }) + assert.NotPanics(t, func() { printMissingDependencies([]string{}) }) + assert.NotPanics(t, func() { printMissingDependencies([]string{"lodash:4.17.21", "chalk:5.3.0"}) }) } diff --git a/go.mod b/go.mod index 8234ef1f..014065e2 100644 --- a/go.mod +++ b/go.mod @@ -7,23 +7,23 @@ require ( github.com/c-bata/go-prompt v0.2.6 github.com/forPelevin/gomoji v1.4.1 github.com/google/go-containerregistry v0.21.3 - github.com/jedib0t/go-pretty/v6 v6.7.8 - github.com/jfrog/build-info-go v1.13.1-0.20260429070557-93b98034d295 + github.com/jedib0t/go-pretty/v6 v6.7.10 + github.com/jfrog/build-info-go v1.13.1-0.20260520130109-bde5000c5601 github.com/jfrog/gofrog v1.7.6 - github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260430125911-ad12ac6f1316 + github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260520130103-75be6a23c54b github.com/jfrog/jfrog-cli-evidence v0.9.0 github.com/jfrog/jfrog-client-go v1.55.1-0.20260508101905-a17af78a38d7 github.com/pkg/errors v0.9.1 github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.11.1 - golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 - golang.org/x/mod v0.34.0 + golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f + golang.org/x/mod v0.35.0 gopkg.in/ini.v1 v1.67.1 helm.sh/helm/v3 v3.19.2 oras.land/oras-go/v2 v2.6.0 ) -require golang.org/x/net v0.52.0 // indirect +require golang.org/x/net v0.53.0 // indirect require ( dario.cat/mergo v1.0.2 // indirect @@ -37,7 +37,7 @@ require ( github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/beevik/etree v1.6.0 // indirect github.com/blang/semver v3.5.1+incompatible // indirect - github.com/buger/jsonparser v1.1.2 // indirect + github.com/buger/jsonparser v1.2.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect @@ -67,8 +67,8 @@ require ( github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/gfleury/go-bitbucket-v1 v0.0.0-20240917142304-df385efaac68 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.8.0 // indirect - github.com/go-git/go-git/v5 v5.18.0 // indirect + github.com/go-git/go-billy/v5 v5.9.0 // indirect + github.com/go-git/go-git/v5 v5.19.1 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/analysis v0.25.0 // indirect @@ -101,7 +101,7 @@ require ( github.com/google/go-github/v74 v74.0.0 // indirect github.com/google/go-querystring v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gookit/color v1.6.0 // indirect + github.com/gookit/color v1.6.1 // indirect github.com/grokify/mogo v0.74.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -136,7 +136,7 @@ require ( github.com/opencontainers/image-spec v1.1.1 // indirect github.com/pelletier/go-toml/v2 v2.3.0 // indirect github.com/pierrec/lz4/v4 v4.1.26 // indirect - github.com/pjbgf/sha1cd v0.5.0 // indirect + github.com/pjbgf/sha1cd v0.6.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/term v1.2.0-beta.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect @@ -180,12 +180,12 @@ require ( go.opentelemetry.io/otel/trace v1.42.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.49.0 // indirect + golang.org/x/crypto v0.50.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.42.0 // indirect - golang.org/x/term v0.41.0 // indirect - golang.org/x/text v0.35.0 // indirect + golang.org/x/sys v0.44.0 // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260319201613-d00831a3d3e7 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7 // indirect @@ -198,7 +198,9 @@ require ( sigs.k8s.io/yaml v1.6.0 // indirect ) -// replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.13.1-0.20260428071432-1e9d9a1991ad +// replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.13.1-0.20260520105053-3d9532efc2f6 + +// replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260520104800-3fa62a50e049 // replace github.com/gfleury/go-bitbucket-v1 => github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab diff --git a/go.sum b/go.sum index 95991e42..ebaaa9d9 100644 --- a/go.sum +++ b/go.sum @@ -101,8 +101,8 @@ github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oM github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v1.1.2 h1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk= -github.com/buger/jsonparser v1.1.2/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/buger/jsonparser v1.2.0 h1:4EFcvK1kD4jyj6YqNK6skK6w+y7FHHBR+XBCtxwu/6g= +github.com/buger/jsonparser v1.2.0/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI= github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -208,12 +208,12 @@ github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug= github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.8.0 h1:I8hjc3LbBlXTtVuFNJuwYuMiHvQJDq1AT6u4DwDzZG0= -github.com/go-git/go-billy/v5 v5.8.0/go.mod h1:RpvI/rw4Vr5QA+Z60c6d6LXH0rYJo0uD5SqfmrrheCY= +github.com/go-git/go-billy/v5 v5.9.0 h1:jItGXszUDRtR/AlferWPTMN4j38BQ88XnXKbilmmBPA= +github.com/go-git/go-billy/v5 v5.9.0/go.mod h1:jCnQMLj9eUgGU7+ludSTYoZL/GGmii14RxKFj7ROgHw= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.18.0 h1:O831KI+0PR51hM2kep6T8k+w0/LIAD490gvqMCvL5hM= -github.com/go-git/go-git/v5 v5.18.0/go.mod h1:pW/VmeqkanRFqR6AljLcs7EA7FbZaN5MQqO7oZADXpo= +github.com/go-git/go-git/v5 v5.19.1 h1:nX27AnaU43/K5bKktKwgBmR9lawoYVe1Ckg0rgzzN00= +github.com/go-git/go-git/v5 v5.19.1/go.mod h1:Pb1v0c7/g8aGQJwx9Us09W85yGoyvSwuhEGMH7zjDKQ= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -313,8 +313,8 @@ github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= github.com/gookit/assert v0.1.1 h1:lh3GcawXe/p+cU7ESTZ5Ui3Sm/x8JWpIis4/1aF0mY0= github.com/gookit/assert v0.1.1/go.mod h1:jS5bmIVQZTIwk42uXl4lyj4iaaxx32tqH16CFj0VX2E= -github.com/gookit/color v1.6.0 h1:JjJXBTk1ETNyqyilJhkTXJYYigHG24TM9Xa2M1xAhRA= -github.com/gookit/color v1.6.0/go.mod h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs= +github.com/gookit/color v1.6.1 h1:KoTnDxJPRgrL0SoX0f8rCFg2zI0t4E3GZZBMo2nN8LU= +github.com/gookit/color v1.6.1/go.mod h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -370,22 +370,22 @@ github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jedib0t/go-pretty/v6 v6.7.8 h1:BVYrDy5DPBA3Qn9ICT+PokP9cvCv1KaHv2i+Hc8sr5o= -github.com/jedib0t/go-pretty/v6 v6.7.8/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.10 h1:B/2qW2Bkv2L6n14PP8o1kx75kWzHOQ3YTluWzg9icac= +github.com/jedib0t/go-pretty/v6 v6.7.10/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 h1:FWpSWRD8FbVkKQu8M1DM9jF5oXFLyE+XpisIYfdzbic= github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7/go.mod h1:BMxO138bOokdgt4UaxZiEfypcSHX0t6SIFimVP1oRfk= github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP4mnWdTY= github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4= github.com/jfrog/archiver/v3 v3.6.3 h1:hkAmPjBw393tPmQ07JknLNWFNZjXdy2xFEnOW9wwOxI= github.com/jfrog/archiver/v3 v3.6.3/go.mod h1:5V9l+Fte30Y4qe9dUOAd3yNTf8lmtVNuhKNrvI8PMhg= -github.com/jfrog/build-info-go v1.13.1-0.20260429070557-93b98034d295 h1:EH0h86KwGvNHWyEBQoHoU9WfMMKy1GJ6jJQNmfy6E0U= -github.com/jfrog/build-info-go v1.13.1-0.20260429070557-93b98034d295/go.mod h1:+OCtMb22/D+u7Wne5lzkjJjaWr0LRZcHlDwTH86Mpwo= +github.com/jfrog/build-info-go v1.13.1-0.20260520130109-bde5000c5601 h1:1PxvU5J9YFZOqPlakqOLVp4Eojfi30TLEZhGsV0LhAA= +github.com/jfrog/build-info-go v1.13.1-0.20260520130109-bde5000c5601/go.mod h1:CYRUCvLKfyARjoJXLWAxce1qNUxTEtbRKAARkV42vpE= github.com/jfrog/froggit-go v1.21.1 h1:I/XUOO6GQ1d/rmBlM361F8T654C3ohIWrpw23xNL9JY= github.com/jfrog/froggit-go v1.21.1/go.mod h1:umBiakJB0CSPFfe0AHVaC3n9xsmUT7NGkDCny3bRchI= github.com/jfrog/gofrog v1.7.6 h1:QmfAiRzVyaI7JYGsB7cxfAJePAZTzFz0gRWZSE27c6s= github.com/jfrog/gofrog v1.7.6/go.mod h1:ntr1txqNOZtHplmaNd7rS4f8jpA5Apx8em70oYEe7+4= -github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260430125911-ad12ac6f1316 h1:xAl5D+SjLeRH1gCsSHFPpXJeQQBv2HDGqDTDkFOKJ2s= -github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260430125911-ad12ac6f1316/go.mod h1:bjAkVD8c2W+jg4whqy10bSXDC/c+Se8/ll/GPp5F/+0= +github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260520130103-75be6a23c54b h1:Bi0dfWKDANYjzV7xVH1eV2LdNdJAE259IXPjX6IDAO0= +github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260520130103-75be6a23c54b/go.mod h1:D9afcOJmauUYcQZ3WGDg7HejyoBmCQr2XrwXHeN1YY8= github.com/jfrog/jfrog-cli-evidence v0.9.0 h1:i9DhkQUxSZkhpp5oGR+N+SVAaqWDiUylbJcoDhM91uQ= github.com/jfrog/jfrog-cli-evidence v0.9.0/go.mod h1:R9faPfyQESBmKrdZCmHvlpmYSHmffswjNnFeT3RMq8I= github.com/jfrog/jfrog-client-go v1.55.1-0.20260508101905-a17af78a38d7 h1:o8fk4yWLqNMldarXyh/4NbmdbYbuM+lKYobdJK7shqM= @@ -473,8 +473,8 @@ github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1H github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY= github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= -github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0= -github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM= +github.com/pjbgf/sha1cd v0.6.0 h1:3WJ8Wz8gvDz29quX1OcEmkAlUg9diU4GxJHqs0/XiwU= +github.com/pjbgf/sha1cd v0.6.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -686,14 +686,14 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= -golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA= -golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= -golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -704,8 +704,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= @@ -740,16 +740,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= -golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -757,16 +757,16 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= -golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= -golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=