You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hexmap/client/magefile.go

110 lines
2.7 KiB

package client
import (
"context"
"git.reya.zone/reya/hexmap/build"
"git.reya.zone/reya/hexmap/proto"
"github.com/magefile/mage/mg"
"github.com/magefile/mage/target"
"os"
"os/exec"
"path/filepath"
)
func NPMInstall(ctx context.Context) error {
var packageLockOutOfDate, nodeModulesOutOfDate bool
var err error
if packageLockOutOfDate, err = target.Path("client/package-lock.json", "client/package-lock.json"); err != nil {
return err
}
if nodeModulesOutOfDate, err = target.Dir("client/node_modules", "client/package.json"); err != nil {
return err
}
if !(packageLockOutOfDate || nodeModulesOutOfDate) {
return nil
}
cmd := exec.CommandContext(ctx, "npm", "install")
cmd.Dir, err = filepath.Abs("client")
if err != nil {
return err
}
cmd.Stderr = os.Stderr
if mg.Verbose() {
cmd.Stdout = os.Stdout
}
return nil
}
func ProtocFlags() ([]string, error) {
buildPath, err := filepath.Abs(filepath.Join(build.ToolsDir, "protoc-gen-ts_proto"))
if err != nil {
return nil, err
}
return []string{
"--plugin=" + buildPath,
"--ts_proto_out=client/src/proto/",
"--ts_proto_opt=env=browser",
"--ts_proto_opt=esModuleInterop=true",
}, nil
}
type Protobuf mg.Namespace
const TSPluginNPMLocation = "client/node_modules/.bin/protoc-gen-ts_proto"
func (Protobuf) InstallTSPlugin(ctx context.Context) error {
mg.CtxDeps(ctx, NPMInstall)
buildPath, err := filepath.Abs(filepath.Join(build.ToolsDir, "protoc-gen-ts_proto"))
if err != nil {
return err
}
sourcePath, err := filepath.Abs(TSPluginNPMLocation)
if err != nil {
return err
}
// Errors here just mean we move on to the next step - this could not exist or not be a link, we don't care.
// The important part is the later parts.
if linkPath, err := os.Readlink(buildPath); err == nil && linkPath == sourcePath {
return nil
}
// Remove whatever's in the way, if necessary.
err = os.Remove(buildPath)
if err != nil && !os.IsNotExist(err) {
return err
}
err = os.Symlink(sourcePath, buildPath)
if err != nil && !os.IsExist(err) {
return err
}
return nil
}
func (Protobuf) MakeProtoDir() error {
if err := os.Mkdir("client/src/proto", 0755); err != nil && !os.IsExist(err) {
return err
}
return nil
}
func (Protobuf) InstallPlugins(ctx context.Context) error {
mg.CtxDeps(ctx, Protobuf.InstallTSPlugin, Protobuf.MakeProtoDir)
return nil
}
func (Protobuf) Build(ctx context.Context) error {
mg.SerialCtxDeps(ctx, Protobuf.Clean, Protobuf.InstallPlugins)
return proto.Compile(ctx, []proto.ProtocFlagsFunc{ProtocFlags})
}
func (Protobuf) Clean() error {
err := os.RemoveAll("client/src/proto")
if err != nil && !os.IsNotExist(err) {
return err
}
return nil
}
// TODO: Build
// TODO: Clean
// TODO: Serve