diff options
Diffstat (limited to 'runner/js/js.go')
| -rw-r--r-- | runner/js/js.go | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/runner/js/js.go b/runner/js/js.go new file mode 100644 index 0000000..7c2af58 --- /dev/null +++ b/runner/js/js.go @@ -0,0 +1,106 @@ +package js + +import ( + "errors" + "github.com/ewy1/pik/identity" + "github.com/ewy1/pik/model" + "github.com/ewy1/pik/runner" + "os/exec" + "path/filepath" + "slices" +) + +var jsExtensions = []string{ + ".js", + ".cjs", +} + +var tsExtensions = []string{ + ".ts", +} + +var extensions = append(jsExtensions, tsExtensions...) + +var managers = []string{ + "pnpm", + "yarn", + "npm", +} + +var jsInterpreters = []string{ + "node", + "bun", +} + +var tsInterpeters = []string{ + "ts", + "ts-node", + "bun", +} + +type js struct { + JsInterpreter string + TsInterpreter string + Npm string +} + +var Js = &js{} + +var UnsupportedFile = errors.New("unsupported file") +var NoJsInterpreter = errors.New("no js interpreter found in $PATH") +var NoTsInterpreter = errors.New("no ts interpreter found in $PATH") +var NoNpm = errors.New("npm not found in $PATH") + +func (n *js) Interpreter(file string) (string, error) { + ext := filepath.Ext(file) + if slices.Contains(jsInterpreters, ext) { + if n.JsInterpreter == "" { + return "", NoJsInterpreter + } + return n.JsInterpreter, nil + } + if slices.Contains(tsInterpeters, ext) { + if n.TsInterpreter == "" { + return "", NoTsInterpreter + } + return n.TsInterpreter, nil + } + return "", UnsupportedFile +} + +func (n *js) Init() error { + for _, p := range jsInterpreters { + if r, err := exec.LookPath(p); err != nil { + n.JsInterpreter = r + } + } + for _, p := range tsInterpeters { + if r, err := exec.LookPath(p); err != nil { + n.TsInterpreter = r + } + } + + for _, m := range managers { + if r, err := exec.LookPath(m); err == nil { + n.Npm = r + } + } + + return nil +} + +var npmSub = []string{ + "npm", +} + +func (n *js) CreateRun(name, cmd string) model.Target { + return &Npm{ + BaseTarget: runner.BaseTarget{ + Identity: identity.New(cmd), + MyTags: model.TagsFromFilename(cmd), + MySub: npmSub, + }, + Name: name, + Cmd: cmd, + } +} |
