UNPKG

@scalvert/bin-tester

Version:

A test harness to invoke a CLI in a tmp directory

105 lines (101 loc) 2.88 kB
var __defProp = Object.defineProperty; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; // src/create-bin-tester.ts import execa2 from "execa"; // src/project.ts import execa from "execa"; import { Project } from "fixturify-project"; var ROOT = process.cwd(); var BinTesterProject = class extends Project { constructor(name = "fake-project", version, cb) { super(name, version, cb); this._dirChanged = false; this.pkg = Object.assign({}, this.pkg, { license: "MIT", description: "Fake project", repository: "http://fakerepo.com" }); } gitInit() { return execa(`git init -q ${this.baseDir}`); } async chdir() { this._dirChanged = true; await this.write(); process.chdir(this.baseDir); } dispose() { if (this._dirChanged) { process.chdir(ROOT); } return super.dispose(); } }; // src/create-bin-tester.ts var DEFAULT_BIN_TESTER_OPTIONS = { staticArgs: [] }; function parseArgs(args) { if (args.length > 0 && typeof args[args.length - 1] === "object") { const execaOptions = args.pop(); return { args, execaOptions }; } else { return { args, execaOptions: {} }; } } function createBinTester(options) { let project; const mergedOptions = __spreadValues(__spreadValues({}, DEFAULT_BIN_TESTER_OPTIONS), options); function runBin(...args) { const mergedRunOptions = parseArgs(args); const binPath = typeof mergedOptions.binPath === "function" ? mergedOptions.binPath(project) : mergedOptions.binPath; return execa2(process.execPath, [binPath, ...mergedOptions.staticArgs, ...mergedRunOptions.args], __spreadValues({ reject: false, cwd: project.baseDir }, mergedRunOptions.execaOptions)); } async function setupProject() { project = "createProject" in mergedOptions ? await mergedOptions.createProject() : new BinTesterProject(); await project.write(); return project; } async function setupTmpDir() { if (typeof project === "undefined") { await setupProject(); } return project.baseDir; } function teardownProject() { project.dispose(); } return { runBin, setupProject, teardownProject, setupTmpDir }; } export { BinTesterProject, createBinTester };