hack/tools/generate-npm-packages/main.go
Rama main · réplica de lectura del repositorio original.
// Copyright 2021-2026 Zenauth Ltd.
// SPDX-License-Identifier: Apache-2.0
package main
import (
"fmt"
"log"
"os"
"path/filepath"
"text/template"
"github.com/cerbos/cerbos/hack/tools/generate-npm-packages/templates"
"go.uber.org/multierr"
"gopkg.in/yaml.v3"
)
var (
binaries = []string{
"cerbos",
"cerbosctl",
}
platforms = []templates.Platform{
{OS: "darwin", Arch: "arm64"},
{OS: "darwin", Arch: "x64"},
{OS: "linux", Arch: "arm64"},
{OS: "linux", Arch: "x64"},
}
)
const (
antoraConfigFile = "docs/antora.yml"
outDir = "npm/packages"
dirPerm = 0o755
)
type AntoraConfig struct {
Version string
Prerelease string
}
func main() {
err := generatePackages()
if err != nil {
log.Fatalln(err)
}
}
func generatePackages() error {
version, err := readVersion()
if err != nil {
return err
}
err = os.RemoveAll(outDir)
if err != nil {
return fmt.Errorf("failed to remove output directory %q: %w", outDir, err)
}
err = os.Mkdir(outDir, dirPerm)
if err != nil {
return fmt.Errorf("failed to create output directory %q: %w", outDir, err)
}
for _, binary := range binaries {
err := generatePackage(binary, templates.WrapperPackage, templates.WrapperPackageData{
Name: binary,
Version: version,
Platforms: platforms,
})
if err != nil {
return err
}
for _, platform := range platforms {
name := fmt.Sprintf("%s-%s", binary, platform)
err := generatePackage(name, templates.BinaryPackage, templates.BinaryPackageData{
Name: name,
Binary: binary,
Platform: platform,
Version: version,
})
if err != nil {
return err
}
}
}
return nil
}
func readVersion() (string, error) {
contents, err := os.ReadFile(antoraConfigFile)
if err != nil {
return "", fmt.Errorf("failed to read Antora config file %q: %w", antoraConfigFile, err)
}
var config AntoraConfig
err = yaml.Unmarshal(contents, &config)
if err != nil {
return "", fmt.Errorf("failed to parse Antora config file %q: %w", antoraConfigFile, err)
}
return config.Version + config.Prerelease, nil
}
func generatePackage(name string, templates *template.Template, data any) error {
packageDir := filepath.Join(outDir, name)
err := os.Mkdir(packageDir, dirPerm)
if err != nil {
return fmt.Errorf("failed to create package directory %q: %w", packageDir, err)
}
for _, template := range templates.Templates() {
err := writeFile(packageDir, template, data)
if err != nil {
return err
}
}
return nil
}
func writeFile(packageDir string, template *template.Template, data any) (err error) {
path := filepath.Join(packageDir, template.Name())
file, err := os.Create(path)
if err != nil {
return fmt.Errorf("failed to create file %q: %w", path, err)
}
defer multierr.AppendInvoke(&err, multierr.Close(file))
err = template.Execute(file, data)
if err != nil {
return fmt.Errorf("failed to generate file %q: %w", path, err)
}
return nil
}