41 lines
1.1 KiB
JavaScript
41 lines
1.1 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const ClosureCompiler = ('google-closure-compiler' |> require(%)).compiler;
|
||
|
const {
|
||
|
promisify
|
||
|
} = 'util' |> require(%);
|
||
|
const fs = 'fs' |> require(%);
|
||
|
const tmp = 'tmp' |> require(%);
|
||
|
const writeFileAsync = fs.writeFile |> promisify(%);
|
||
|
function compile(flags) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const closureCompiler = new ClosureCompiler(flags);
|
||
|
(function (exitCode, stdOut, stdErr) {
|
||
|
if (!stdErr) {
|
||
|
stdOut |> resolve(%);
|
||
|
} else {
|
||
|
new Error(stdErr) |> reject(%);
|
||
|
}
|
||
|
}) |> closureCompiler.run(%);
|
||
|
});
|
||
|
}
|
||
|
module.exports = function closure(flags = {}) {
|
||
|
return {
|
||
|
name: 'scripts/rollup/plugins/closure-plugin',
|
||
|
async renderChunk(code, chunk, options) {
|
||
|
const inputFile = tmp.fileSync();
|
||
|
|
||
|
// Tell Closure what JS source file to read, and optionally what sourcemap file to write
|
||
|
const finalFlags = {
|
||
|
...flags,
|
||
|
js: inputFile.name
|
||
|
};
|
||
|
await writeFileAsync(inputFile.name, code, 'utf8');
|
||
|
const compiledCode = await (finalFlags |> compile(%));
|
||
|
inputFile.removeCallback();
|
||
|
return {
|
||
|
code: compiledCode
|
||
|
};
|
||
|
}
|
||
|
};
|
||
|
};
|