2016-08-19 01:23:44 +00:00
|
|
|
import * as babel from 'babel-core';
|
|
|
|
import presetEs2015 from 'babel-preset-es2015';
|
|
|
|
import presetReact from 'babel-preset-react';
|
2016-05-20 19:42:26 +00:00
|
|
|
import { Observable } from 'rx';
|
2016-06-24 03:05:30 +00:00
|
|
|
/* eslint-disable import/no-unresolved */
|
2016-05-20 19:42:26 +00:00
|
|
|
import loopProtect from 'loop-protect';
|
2016-06-24 03:05:30 +00:00
|
|
|
/* eslint-enable import/no-unresolved */
|
2016-05-20 19:42:26 +00:00
|
|
|
|
2016-05-28 00:11:25 +00:00
|
|
|
import { updateContents } from '../../common/utils/polyvinyl';
|
|
|
|
|
2016-08-19 01:23:44 +00:00
|
|
|
const babelOptions = { presets: [ presetEs2015, presetReact ] };
|
2016-05-20 19:42:26 +00:00
|
|
|
loopProtect.hit = function hit(line) {
|
2016-10-25 09:58:46 +00:00
|
|
|
var err = 'Exiting potential infinite loop at line ' +
|
2016-05-20 19:42:26 +00:00
|
|
|
line +
|
2016-10-25 09:58:46 +00:00
|
|
|
'. To disable loop protection, write: \n\/\/ noprotect\nas the first ' +
|
|
|
|
'line. Beware that if you do have an infinite loop in your code, ' +
|
2016-05-20 19:42:26 +00:00
|
|
|
'this will crash your browser.';
|
2016-10-25 09:58:46 +00:00
|
|
|
throw new Error(err);
|
2016-05-20 19:42:26 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
const transformersForHtmlJS = {
|
|
|
|
ext: /html|js/,
|
|
|
|
transformers: [
|
|
|
|
{
|
|
|
|
name: 'add-loop-protect',
|
|
|
|
transformer: function addLoopProtect(file) {
|
2016-05-28 00:11:25 +00:00
|
|
|
return updateContents(loopProtect(file.contents), file);
|
2016-05-20 19:42:26 +00:00
|
|
|
}
|
2016-10-30 23:36:25 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
name: 'replace-nbsp',
|
|
|
|
nbspRegExp: new RegExp(String.fromCharCode(160), 'g'),
|
|
|
|
transformer: function replaceNBSP(file) {
|
|
|
|
return updateContents(
|
|
|
|
file.contents.replace(this.nbspRegExp, ' '),
|
|
|
|
file
|
|
|
|
);
|
|
|
|
}
|
2016-05-20 19:42:26 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
};
|
|
|
|
|
2016-08-19 01:23:44 +00:00
|
|
|
const transformersForJs = {
|
|
|
|
ext: /js/,
|
|
|
|
transformers: [
|
|
|
|
{
|
|
|
|
name: 'babel-transformer',
|
|
|
|
transformer: function babelTransformer(file) {
|
|
|
|
const result = babel.transform(file.contents, babelOptions);
|
|
|
|
return updateContents(
|
|
|
|
result.code,
|
|
|
|
file
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
};
|
2016-05-20 19:42:26 +00:00
|
|
|
|
|
|
|
// Observable[Observable[File]]::addLoopProtect() => Observable[String]
|
|
|
|
export default function transformers() {
|
|
|
|
const source = this;
|
|
|
|
return source.map(files$ => files$.flatMap(file => {
|
|
|
|
if (!transformersForHtmlJS.ext.test(file.ext)) {
|
|
|
|
return Observable.just(file);
|
|
|
|
}
|
2016-08-19 01:23:44 +00:00
|
|
|
if (
|
|
|
|
transformersForJs.ext.test(file.ext) &&
|
|
|
|
transformersForHtmlJS.ext.test(file.ext)
|
|
|
|
) {
|
|
|
|
return Observable.of(
|
|
|
|
...transformersForHtmlJS.transformers,
|
|
|
|
...transformersForJs.transformers
|
|
|
|
)
|
|
|
|
.reduce((file, context) => context.transformer(file), file);
|
|
|
|
}
|
2016-05-20 19:42:26 +00:00
|
|
|
return Observable.from(transformersForHtmlJS.transformers)
|
|
|
|
.reduce((file, context) => context.transformer(file), file);
|
|
|
|
}));
|
|
|
|
}
|