-
Notifications
You must be signed in to change notification settings - Fork 5
/
packagescripts.go
67 lines (59 loc) · 1.51 KB
/
packagescripts.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package nodejs
import (
"encoding/json"
"margo.sh/mg"
"os"
"sort"
)
// PackageScripts adds UserCmd entries for each script defined in package.json
type PackageScripts struct {
mg.ReducerType
// Cmd is the command to run i.e. `yarn` or `npm`
// if not set and `yarn.lock` in found in the package root, `yarn` will be used,
// otherwise `npm` is use.
Cmd string
}
func (ps *PackageScripts) RCond(mx *mg.Ctx) bool {
return mx.ActionIs(mg.QueryUserCmds{})
}
func (ps *PackageScripts) cmd(mx *mg.Ctx, root string) string {
if ps.Cmd != "" {
return ps.Cmd
}
if _, _, err := mx.VFS.Poke(root).Locate("yarn.lock"); err == nil {
return "yarn"
}
return "npm"
}
func (ps *PackageScripts) Reduce(mx *mg.Ctx) *mg.State {
p := struct{ Scripts map[string]string }{}
root, ok := ps.scanPkgJSON(mx, mx.View.Dir(), &p)
if !ok || len(p.Scripts) == 0 {
return mx.State
}
cmds := make(mg.UserCmdList, 0, len(p.Scripts))
cmd := ps.cmd(mx, root)
for name, script := range p.Scripts {
cmds = append(cmds, mg.UserCmd{
Title: cmd + " run " + name,
Desc: script,
Name: cmd,
Args: []string{"run", name},
})
}
sort.Sort(cmds)
return mx.AddUserCmds(cmds...)
}
func (ps *PackageScripts) scanPkgJSON(mx *mg.Ctx, dir string, p interface{}) (root string, ok bool) {
nd, _, err := mx.VFS.Poke(dir).Locate("package.json")
if err != nil {
return "", false
}
f, err := os.Open(nd.Path())
if err != nil {
return "", false
}
defer f.Close()
err = json.NewDecoder(f).Decode(p)
return nd.Parent().Path(), err == nil
}