| 
									
										
										
										
											2016-08-18 18:23:44 -07:00
										 |  |  | import * as babel from 'babel-core'; | 
					
						
							|  |  |  | import presetEs2015 from 'babel-preset-es2015'; | 
					
						
							|  |  |  | import presetReact from 'babel-preset-react'; | 
					
						
							| 
									
										
										
										
											2016-05-20 12:42:26 -07:00
										 |  |  | import { Observable } from 'rx'; | 
					
						
							| 
									
										
										
										
											2016-06-23 20:05:30 -07:00
										 |  |  | /* eslint-disable import/no-unresolved */ | 
					
						
							| 
									
										
										
										
											2016-05-20 12:42:26 -07:00
										 |  |  | import loopProtect from 'loop-protect'; | 
					
						
							| 
									
										
										
										
											2016-06-23 20:05:30 -07:00
										 |  |  | /* eslint-enable import/no-unresolved */ | 
					
						
							| 
									
										
										
										
											2016-05-20 12:42:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-27 17:11:25 -07:00
										 |  |  | import { updateContents } from '../../common/utils/polyvinyl'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 18:23:44 -07:00
										 |  |  | const babelOptions = { presets: [ presetEs2015, presetReact ] }; | 
					
						
							| 
									
										
										
										
											2016-05-20 12:42:26 -07:00
										 |  |  | loopProtect.hit = function hit(line) { | 
					
						
							| 
									
										
										
										
											2016-10-25 10:58:46 +01:00
										 |  |  |   var err = 'Exiting potential infinite loop at line ' + | 
					
						
							| 
									
										
										
										
											2016-05-20 12:42:26 -07:00
										 |  |  |     line + | 
					
						
							| 
									
										
										
										
											2016-10-25 10:58:46 +01: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 12:42:26 -07:00
										 |  |  |     'this will crash your browser.'; | 
					
						
							| 
									
										
										
										
											2016-10-25 10:58:46 +01:00
										 |  |  |   throw new Error(err); | 
					
						
							| 
									
										
										
										
											2016-05-20 12:42:26 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const transformersForHtmlJS = { | 
					
						
							|  |  |  |   ext: /html|js/, | 
					
						
							|  |  |  |   transformers: [ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       name: 'add-loop-protect', | 
					
						
							|  |  |  |       transformer: function addLoopProtect(file) { | 
					
						
							| 
									
										
										
										
											2017-01-31 05:30:23 +04:00
										 |  |  |         const _contents = file.contents.toLowerCase(); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:42:50 -05:00
										 |  |  |         if (file.ext === 'html' && _contents.indexOf('<script>') === -1) { | 
					
						
							| 
									
										
										
										
											2017-01-31 05:30:23 +04:00
										 |  |  |           // No JavaScript in user code, so no need for loopProtect
 | 
					
						
							|  |  |  |           return updateContents(file.contents, file); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-05-27 17:11:25 -07:00
										 |  |  |         return updateContents(loopProtect(file.contents), file); | 
					
						
							| 
									
										
										
										
											2016-05-20 12:42:26 -07: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 12:42:26 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   ] | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 18:23:44 -07: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 12:42:26 -07: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-18 18:23:44 -07: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 12:42:26 -07:00
										 |  |  |     return Observable.from(transformersForHtmlJS.transformers) | 
					
						
							|  |  |  |       .reduce((file, context) => context.transformer(file), file); | 
					
						
							|  |  |  |   })); | 
					
						
							|  |  |  | } |