diff --git a/bin/moshcode.mjs b/bin/moshcode.mjs index 80afd6a..40b9d48 100755 --- a/bin/moshcode.mjs +++ b/bin/moshcode.mjs @@ -286,7 +286,7 @@ async function main() { catch (e) { console.error(String(e.message || e)); process.exit(1); } } else if (a === "--dry-run") dryRun = true; - else if (a.startsWith("-") && positional.length === 0) { + else if (a !== "-" && a.startsWith("-") && positional.length === 0) { console.error(`moshcode run: unknown option ${a}`); process.exit(1); } diff --git a/test/run-options.test.mjs b/test/run-options.test.mjs index 7d1b7ee..c35ea77 100644 --- a/test/run-options.test.mjs +++ b/test/run-options.test.mjs @@ -42,6 +42,39 @@ test("run rejects unknown options before treating them as files", async () => { assert.match(result.stderr, /moshcode run: unknown option --dryrun/); }); +function runWithStdin(args, input) { + return new Promise((resolve, reject) => { + const dir = mkdtempSync(join(tmpdir(), "moshcode-run-stdin-")); + const stdinFile = join(dir, "stdin"); + const stdoutFile = join(dir, "stdout"); + const stderrFile = join(dir, "stderr"); + writeFileSync(stdinFile, input); + const stdin = openSync(stdinFile, "r"); + const stdout = openSync(stdoutFile, "w"); + const stderr = openSync(stderrFile, "w"); + const child = spawn(process.execPath, [BIN, "run", ...args], { + stdio: [stdin, stdout, stderr], + }); + let failed = false; + child.on("error", (error) => { failed = true; reject(error); }); + child.on("close", (status) => { + for (const fd of [stdin, stdout, stderr]) closeSync(fd); + if (!failed) resolve({ + status, + stdout: readFileSync(stdoutFile, "utf8"), + stderr: readFileSync(stderrFile, "utf8"), + }); + }); + }); +} + +test("run - reads the script from stdin", async () => { + const result = await runWithStdin(["-"], 'say("from stdin");\n'); + + assert.equal(result.status, 0); + assert.match(result.stdout, /from stdin/); +}); + test("run accepts equals-form max option", async () => { const result = await run(["--max=1", "--dry-run"]);