go-build/pkg/build/builders/package_manager.go
Virgil f5a8062ffd feat(build): honor package manager declarations
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-01 17:59:04 +00:00

52 lines
1.1 KiB
Go

package builders
import (
"encoding/json"
"strings"
"dappco.re/go/core/build/internal/ax"
"dappco.re/go/core/io"
)
type packageJSONManifest struct {
PackageManager string `json:"packageManager"`
}
// detectDeclaredPackageManager reads package.json and returns the declared package manager.
//
// manager := detectDeclaredPackageManager(io.Local, ".")
func detectDeclaredPackageManager(fs io.Medium, dir string) string {
content, err := fs.Read(ax.Join(dir, "package.json"))
if err != nil {
return ""
}
var manifest packageJSONManifest
if err := json.Unmarshal([]byte(content), &manifest); err != nil {
return ""
}
return normalisePackageManager(manifest.PackageManager)
}
// normalisePackageManager trims any pinned version from a packageManager declaration.
//
// manager := normalisePackageManager("pnpm@9.12.0")
func normalisePackageManager(value string) string {
value = strings.TrimSpace(value)
if value == "" {
return ""
}
manager, _, found := strings.Cut(value, "@")
if !found {
manager = value
}
switch manager {
case "bun", "pnpm", "yarn", "npm":
return manager
default:
return ""
}
}