You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.1 KiB
45 lines
1.1 KiB
'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;
|
|
|