diff --git a/package.json b/package.json index d62bb74..1ecad94 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@endeavorance/rundir", "type": "module", "module": "src/cli.ts", - "version": "0.1.1", + "version": "0.2.0", "bin": { "rundir": "build/cli.js" }, diff --git a/src/cli.ts b/src/cli.ts index 481dab2..191fd58 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,5 +1,4 @@ import { existsSync } from "node:fs"; -import { homedir } from "node:os"; import path from "node:path"; import { parseArgs } from "node:util"; import { $, Glob } from "bun"; @@ -20,13 +19,20 @@ class CLIError extends Error { } } +class NoRundirError extends CLIError { + name = "NoRundirError"; + + constructor() { + super("No rundir found in current directory tree"); + } +} + const TEMPLATE_FILE_PATH = process.env["RUNDIR_TEMPLATE"] ?? null; const DEFAULT_TEMPLATE = ` #!/usr/bin/env bash # Description... `.trim(); const VERSION = pkg.version; -const RUNDIR_PATH = path.join(process.cwd(), ".run"); const COMMENT_STARTERS = ["#", "//", "--"]; const COMMANDS = ["ls", "help", "new", "create", "which", "x", "run"] as const; type Command = (typeof COMMANDS)[number]; @@ -77,7 +83,7 @@ function makeScriptPath(name: string): string { const rundir = findNearestRundir(); if (!rundir) { - throw new CLIError("No rundir found in the current directory tree."); + throw new NoRundirError(); } return path.join(rundir, name); @@ -94,22 +100,23 @@ function makeScriptPath(name: string): string { * @param name The name of the script to find the path of */ async function findScriptPath(name: string): Promise { - let currentDir = process.cwd(); + const currentRundir = findNearestRundir(); - while (currentDir !== path.dirname(currentDir)) { - const potentialPath = path.join(currentDir, ".run", name); - if (await Bun.file(potentialPath).exists()) { - return potentialPath; - } - currentDir = path.dirname(currentDir); + if (!currentRundir) { + throw new NoRundirError(); } - const homeDirPath = path.join(homedir(), ".run", name); - if (await Bun.file(homeDirPath).exists()) { - return homeDirPath; + const expectedPath = path.join(currentRundir, name); + + const checkFile = Bun.file(expectedPath); + + const exists = await checkFile.exists(); + + if (!exists) { + return null; } - return null; + return expectedPath; } /** @@ -245,7 +252,7 @@ async function newScript(name: string) { await Bun.write(scriptFile, template); await $`chmod +x ${scriptPath}`; - console.log(name); + console.log(scriptFile); } /** @@ -260,7 +267,23 @@ async function runScript(name: string) { process.exit(1); } - await $`${scriptPath}`; + const rundir = path.dirname(scriptPath); + const cwd = path.resolve(rundir, ".."); + + const proc = Bun.spawn([scriptPath], { + cwd, + env: { + ...process.env, + RUNDIR_PATH: rundir, + RUNDIR_CWD: cwd, + RUNDIR_SCRIPT_PATH: scriptPath, + }, + stdout: Bun.stdout, + stderr: Bun.stderr, + stdin: Bun.stdin, + }); + + await proc.exited; } /**