From 1945a89539a22748b71eb619788333b7957a4bde Mon Sep 17 00:00:00 2001 From: Grigorii Zander Date: Sat, 5 Feb 2022 19:34:51 +0100 Subject: [PATCH] fixed crash and added error message if packageManager field is invalid --- cli/internal/backends/nodejs/nodejs.go | 23 +++++++++++++++++------ cli/internal/fs/package_json.go | 6 +++--- cli/internal/util/backends.go | 10 +++++++--- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/cli/internal/backends/nodejs/nodejs.go b/cli/internal/backends/nodejs/nodejs.go index 92cc67b5ec483..379f35e356bcf 100644 --- a/cli/internal/backends/nodejs/nodejs.go +++ b/cli/internal/backends/nodejs/nodejs.go @@ -38,7 +38,11 @@ var NodejsYarnBackend = api.LanguageBackend{ }, Detect: func(cwd string, pkg *fs.PackageJSON, backend *api.LanguageBackend) (bool, error) { if pkg.PackageManager != "" { - packageManager, version := util.GetPackageManagerAndVersion(pkg.PackageManager) + packageManager, version, err := util.GetPackageManagerAndVersion(pkg.PackageManager) + + if err != nil { + return false, err + } if packageManager != "yarn" { return false, nil @@ -95,8 +99,11 @@ var NodejsBerryBackend = api.LanguageBackend{ }, Detect: func(cwd string, pkg *fs.PackageJSON, backend *api.LanguageBackend) (bool, error) { if pkg.PackageManager != "" { - packageManager, version := util.GetPackageManagerAndVersion(pkg.PackageManager) + packageManager, version, err := util.GetPackageManagerAndVersion(pkg.PackageManager) + if err != nil { + return false, err + } if packageManager != "yarn" { return false, nil } @@ -178,8 +185,10 @@ var NodejsPnpmBackend = api.LanguageBackend{ }, Detect: func(cwd string, pkg *fs.PackageJSON, backend *api.LanguageBackend) (bool, error) { if pkg.PackageManager != "" { - packageManager, _ := util.GetPackageManagerAndVersion(pkg.PackageManager) - + packageManager, _, err := util.GetPackageManagerAndVersion(pkg.PackageManager) + if err != nil { + return false, err + } if packageManager == "pnpm" { return true, nil } @@ -221,8 +230,10 @@ var NodejsNpmBackend = api.LanguageBackend{ }, Detect: func(cwd string, pkg *fs.PackageJSON, backend *api.LanguageBackend) (bool, error) { if pkg.PackageManager != "" { - packageManager, _ := util.GetPackageManagerAndVersion(pkg.PackageManager) - + packageManager, _, err := util.GetPackageManagerAndVersion(pkg.PackageManager) + if err != nil { + return false, err + } if packageManager == "npm" { return true, nil } diff --git a/cli/internal/fs/package_json.go b/cli/internal/fs/package_json.go index 5f6a0b9ba6187..d662e0e1affac 100644 --- a/cli/internal/fs/package_json.go +++ b/cli/internal/fs/package_json.go @@ -9,16 +9,16 @@ import ( // TurboConfigJSON is the root turborepo configuration type TurboConfigJSON struct { // Base Git branch - Base string `json:"baseBranch,omitempty"` + Base string `json:"baseBranch,omitempty"` // Global root filesystem dependencies GlobalDependencies []string `json:"globalDependencies,omitempty"` TurboCacheOptions string `json:"cacheOptions,omitempty"` Outputs []string `json:"outputs,omitempty"` // RemoteCacheUrl is the Remote Cache API URL - RemoteCacheUrl string `json:"remoteCacheUrl,omitempty"` + RemoteCacheUrl string `json:"remoteCacheUrl,omitempty"` // Pipeline is a map of Turbo pipeline entries which define the task graph // and cache behavior on a per task or per package-task basis. - Pipeline map[string]Pipeline + Pipeline map[string]Pipeline } func ReadTurboConfigJSON(path string) (*TurboConfigJSON, error) { diff --git a/cli/internal/util/backends.go b/cli/internal/util/backends.go index 1f4b6241bf97a..abf6944d7b7d7 100644 --- a/cli/internal/util/backends.go +++ b/cli/internal/util/backends.go @@ -68,9 +68,13 @@ func IsNMLinker(cwd string) (bool, error) { return yarnRC.NodeLinker == "node-modules", nil } -func GetPackageManagerAndVersion(packageManager string) (string, string) { - re := regexp.MustCompile(`(npm|pnpm|yarn)@(\d+)\.\d+\.\d+(-.+)?`) +func GetPackageManagerAndVersion(packageManager string) (string, string, error) { + pattern := `(npm|pnpm|yarn)@(\d+)\.\d+\.\d+(-.+)?` + re := regexp.MustCompile(pattern) match := re.FindString(packageManager) + if len(match) == 0 { + return "", "", fmt.Errorf("could not parse packageManager field in package.json, expected: %s, received: %s", pattern, packageManager) + } - return strings.Split(match, "@")[0], strings.Split(match, "@")[1] + return strings.Split(match, "@")[0], strings.Split(match, "@")[1], nil }