46 lines
1.1 KiB
JavaScript
46 lines
1.1 KiB
JavaScript
'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;
|