summaryrefslogtreecommitdiff
path: root/runner/js/js.go
diff options
context:
space:
mode:
Diffstat (limited to 'runner/js/js.go')
-rw-r--r--runner/js/js.go106
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,
+ }
+}