56 lines
1.5 KiB
JavaScript
56 lines
1.5 KiB
JavaScript
|
/* global onmessage: true, postMessage: false */
|
||
|
'use strict';
|
||
|
|
||
|
const fs = require('fs-extra');
|
||
|
const path = require('path');
|
||
|
const babel = require('babel-core');
|
||
|
const multimatch = require('multimatch');
|
||
|
const options = JSON.parse(fs.readFileSync('.babelrc'));
|
||
|
const cluster = require('cluster');
|
||
|
|
||
|
/* exported onmessage */
|
||
|
async function babelWorker(ev) {
|
||
|
const t1 = Date.now();
|
||
|
const sourcefile = ev.file;
|
||
|
const outfile = path.join('build', sourcefile);
|
||
|
const postError = (error) => {
|
||
|
process.send({
|
||
|
sourcefile,
|
||
|
outfile,
|
||
|
error
|
||
|
});
|
||
|
};
|
||
|
|
||
|
var isSkipped = false;
|
||
|
var transformed;
|
||
|
|
||
|
try {
|
||
|
let contents = await fs.readFile(sourcefile, 'utf8');
|
||
|
if (sourcefile === 'resource/react-dom.js') {
|
||
|
// patch react
|
||
|
transformed = contents.replace(/ownerDocument\.createElement\((.*?)\)/gi, 'ownerDocument.createElementNS(DOMNamespaces.html, $1)');
|
||
|
} else if ('ignore' in options && options.ignore.some(ignoreGlob => multimatch(sourcefile, ignoreGlob).length)) {
|
||
|
transformed = contents;
|
||
|
isSkipped = true;
|
||
|
} else {
|
||
|
try {
|
||
|
transformed = babel.transform(contents, options).code;
|
||
|
} catch (error) { return postError(`Babel error: ${error}`);}
|
||
|
}
|
||
|
|
||
|
await fs.outputFile(outfile, transformed);
|
||
|
const t2 = Date.now();
|
||
|
process.send({
|
||
|
isSkipped,
|
||
|
sourcefile,
|
||
|
outfile,
|
||
|
processingTime: t2 - t1
|
||
|
});
|
||
|
} catch (error) { return postError(`I/O error: ${error}`); }
|
||
|
}
|
||
|
|
||
|
module.exports = babelWorker;
|
||
|
|
||
|
if (cluster.isWorker) {
|
||
|
process.on('message', babelWorker);
|
||
|
}
|