-
Notifications
You must be signed in to change notification settings - Fork 58
/
resolve-bundle.js
46 lines (36 loc) · 1.13 KB
/
resolve-bundle.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
'use strict';
const fs = require('fs').promises;
const execa = require('execa');
const { parseArgsStringToArgv } = require('string-argv');
exports.resolveBundle = resolveBundle;
async function resolveBundle(command, resolved_spec) {
if (
typeof resolved_spec === 'object' &&
typeof resolved_spec.pipe === 'function'
) {
return bufferStream(resolved_spec);
}
if (!command) {
return concatFiles(resolved_spec);
}
const [cmd, ...args] = parseArgsStringToArgv(command);
const result = await execa(cmd, args.concat(resolved_spec), {
preferLocal: true
});
if (result.failed || result.killed) {
throw new Error(result.shortMessage);
}
return result.stdout;
}
async function concatFiles(files) {
const buffers = await Promise.all(files.map((file) => fs.readFile(file)));
return Buffer.concat(buffers).toString('utf8');
}
function bufferStream(stream) {
return new Promise((resolve, reject) => {
const buffers = [];
stream.on('data', (chunk) => buffers.push(chunk));
stream.on('error', (err) => reject(err));
stream.on('end', () => resolve(Buffer.concat(buffers).toString('utf8')));
});
}