| 'use strict'; |
| const fs = require('fs'); |
| const execa = require('execa'); |
| const pFinally = require('p-finally'); |
| const pify = require('pify'); |
| const rimraf = require('rimraf'); |
| const tempfile = require('tempfile'); |
| |
| const fsP = pify(fs); |
| const rmP = pify(rimraf); |
| const input = Symbol('inputPath'); |
| const output = Symbol('outputPath'); |
| |
| module.exports = opts => { |
| opts = Object.assign({}, opts); |
| |
| if (!Buffer.isBuffer(opts.input)) { |
| return Promise.reject(new Error('Input is required')); |
| } |
| |
| if (typeof opts.bin !== 'string') { |
| return Promise.reject(new Error('Binary is required')); |
| } |
| |
| if (!Array.isArray(opts.args)) { |
| return Promise.reject(new Error('Arguments are required')); |
| } |
| |
| const inputPath = opts.inputPath || tempfile(); |
| const outputPath = opts.outputPath || tempfile(); |
| |
| opts.args = opts.args.map(x => x === input ? inputPath : x === output ? outputPath : x); |
| |
| const promise = fsP.writeFile(inputPath, opts.input) |
| .then(() => execa(opts.bin, opts.args)) |
| .then(() => fsP.readFile(outputPath)); |
| |
| return pFinally(promise, () => Promise.all([ |
| rmP(inputPath), |
| rmP(outputPath) |
| ])); |
| }; |
| |
| module.exports.input = input; |
| module.exports.output = output; |