This is a naive implementation. Ideally we would detect the users environment and dynamically load only the appropriate plugins
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import * as babel from 'babel-core';
 | 
						|
import presetEs2015 from 'babel-preset-es2015';
 | 
						|
import presetReact from 'babel-preset-react';
 | 
						|
import { Observable } from 'rx';
 | 
						|
/* eslint-disable import/no-unresolved */
 | 
						|
import loopProtect from 'loop-protect';
 | 
						|
/* eslint-enable import/no-unresolved */
 | 
						|
 | 
						|
import { updateContents } from '../../common/utils/polyvinyl';
 | 
						|
 | 
						|
const babelOptions = { presets: [ presetEs2015, presetReact ] };
 | 
						|
loopProtect.hit = function hit(line) {
 | 
						|
  var err = 'Error: Exiting potential infinite loop at line ' +
 | 
						|
    line +
 | 
						|
    '. To disable loop protection, write: \n\\/\\/ noprotect\nas the first' +
 | 
						|
    'line. Beware that if you do have an infinite loop in your code' +
 | 
						|
    'this will crash your browser.';
 | 
						|
  console.error(err);
 | 
						|
};
 | 
						|
 | 
						|
const transformersForHtmlJS = {
 | 
						|
  ext: /html|js/,
 | 
						|
  transformers: [
 | 
						|
    {
 | 
						|
      name: 'add-loop-protect',
 | 
						|
      transformer: function addLoopProtect(file) {
 | 
						|
        return updateContents(loopProtect(file.contents), file);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  ]
 | 
						|
};
 | 
						|
 | 
						|
const transformersForJs = {
 | 
						|
  ext: /js/,
 | 
						|
  transformers: [
 | 
						|
    {
 | 
						|
      name: 'babel-transformer',
 | 
						|
      transformer: function babelTransformer(file) {
 | 
						|
        const result = babel.transform(file.contents, babelOptions);
 | 
						|
        return updateContents(
 | 
						|
          result.code,
 | 
						|
          file
 | 
						|
        );
 | 
						|
      }
 | 
						|
    }
 | 
						|
  ]
 | 
						|
};
 | 
						|
 | 
						|
// 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);
 | 
						|
    }
 | 
						|
    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);
 | 
						|
    }
 | 
						|
    return Observable.from(transformersForHtmlJS.transformers)
 | 
						|
      .reduce((file, context) => context.transformer(file), file);
 | 
						|
  }));
 | 
						|
}
 |