| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  | // originally based off of https://github.com/gulpjs/vinyl
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | const invariant = require('invariant'); | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // interface PolyVinyl {
 | 
					
						
							|  |  |  | //   source: String,
 | 
					
						
							|  |  |  | //   contents: String,
 | 
					
						
							|  |  |  | //   name: String,
 | 
					
						
							|  |  |  | //   ext: String,
 | 
					
						
							|  |  |  | //   path: String,
 | 
					
						
							|  |  |  | //   key: String,
 | 
					
						
							|  |  |  | //   head: String,
 | 
					
						
							|  |  |  | //   tail: String,
 | 
					
						
							|  |  |  | //   history: [...String],
 | 
					
						
							|  |  |  | //   error: Null|Object|Error
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // createPoly({
 | 
					
						
							|  |  |  | //   name: String,
 | 
					
						
							|  |  |  | //   ext: String,
 | 
					
						
							|  |  |  | //   contents: String,
 | 
					
						
							|  |  |  | //   history?: [...String],
 | 
					
						
							|  |  |  | // }) => PolyVinyl, throws
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | function createPoly({ name, ext, contents, history, ...rest } = {}) { | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |   invariant(typeof name === 'string', 'name must be a string but got %s', name); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   invariant(typeof ext === 'string', 'ext must be a string, but was %s', ext); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   invariant( | 
					
						
							|  |  |  |     typeof contents === 'string', | 
					
						
							|  |  |  |     'contents must be a string but got %s', | 
					
						
							|  |  |  |     contents | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     ...rest, | 
					
						
							| 
									
										
										
										
											2019-01-09 03:39:05 +03:00
										 |  |  |     history: Array.isArray(history) ? history : [name + '.' + ext], | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |     name, | 
					
						
							|  |  |  |     ext, | 
					
						
							|  |  |  |     path: name + '.' + ext, | 
					
						
							|  |  |  |     key: name + ext, | 
					
						
							|  |  |  |     contents, | 
					
						
							|  |  |  |     error: null | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // isPoly(poly: Any) => Boolean
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | function isPoly(poly) { | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |   return ( | 
					
						
							|  |  |  |     poly && | 
					
						
							|  |  |  |     typeof poly.contents === 'string' && | 
					
						
							|  |  |  |     typeof poly.name === 'string' && | 
					
						
							|  |  |  |     typeof poly.ext === 'string' && | 
					
						
							|  |  |  |     Array.isArray(poly.history) | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // checkPoly(poly: Any) => Void, throws
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | function checkPoly(poly) { | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |   invariant( | 
					
						
							|  |  |  |     isPoly(poly), | 
					
						
							|  |  |  |     'function should receive a PolyVinyl, but got %s', | 
					
						
							|  |  |  |     poly | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // setContent(contents: String, poly: PolyVinyl) => PolyVinyl
 | 
					
						
							|  |  |  | // setContent will loose source if set
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | function setContent(contents, poly) { | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |   checkPoly(poly); | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     ...poly, | 
					
						
							|  |  |  |     contents, | 
					
						
							|  |  |  |     source: null | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // setExt(ext: String, poly: PolyVinyl) => PolyVinyl
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | function setExt(ext, poly) { | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |   checkPoly(poly); | 
					
						
							|  |  |  |   const newPoly = { | 
					
						
							|  |  |  |     ...poly, | 
					
						
							|  |  |  |     ext, | 
					
						
							|  |  |  |     path: poly.name + '.' + ext, | 
					
						
							|  |  |  |     key: poly.name + ext | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   newPoly.history = [...poly.history, newPoly.path]; | 
					
						
							|  |  |  |   return newPoly; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-05 20:15:13 +02:00
										 |  |  | // setImportedFiles(importedFiles: String[], poly: PolyVinyl) => PolyVinyl
 | 
					
						
							|  |  |  | function setImportedFiles(importedFiles, poly) { | 
					
						
							|  |  |  |   checkPoly(poly); | 
					
						
							|  |  |  |   const newPoly = { | 
					
						
							|  |  |  |     ...poly, | 
					
						
							|  |  |  |     importedFiles: [...importedFiles] | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   return newPoly; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  | // clearHeadTail(poly: PolyVinyl) => PolyVinyl
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | function clearHeadTail(poly) { | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |   checkPoly(poly); | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     ...poly, | 
					
						
							|  |  |  |     head: '', | 
					
						
							|  |  |  |     tail: '' | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // compileHeadTail(padding: String, poly: PolyVinyl) => PolyVinyl
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | function compileHeadTail(padding = '', poly) { | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |   return clearHeadTail( | 
					
						
							|  |  |  |     transformContents( | 
					
						
							|  |  |  |       () => [poly.head, poly.contents, poly.tail].join(padding), | 
					
						
							|  |  |  |       poly | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // transformContents(
 | 
					
						
							|  |  |  | //   wrap: (contents: String) => String,
 | 
					
						
							|  |  |  | //   poly: PolyVinyl
 | 
					
						
							|  |  |  | // ) => PolyVinyl
 | 
					
						
							|  |  |  | // transformContents will keep a copy of the original
 | 
					
						
							|  |  |  | // code in the `source` property. If the original polyvinyl
 | 
					
						
							|  |  |  | // already contains a source, this version will continue as
 | 
					
						
							|  |  |  | // the source property
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | function transformContents(wrap, poly) { | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |   const newPoly = setContent(wrap(poly.contents), poly); | 
					
						
							|  |  |  |   // if no source exist, set the original contents as source
 | 
					
						
							|  |  |  |   newPoly.source = poly.source || poly.contents; | 
					
						
							|  |  |  |   return newPoly; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // transformHeadTailAndContents(
 | 
					
						
							|  |  |  | //   wrap: (source: String) => String,
 | 
					
						
							|  |  |  | //   poly: PolyVinyl
 | 
					
						
							|  |  |  | // ) => PolyVinyl
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | function transformHeadTailAndContents(wrap, poly) { | 
					
						
							| 
									
										
										
										
											2018-04-06 14:51:52 +01:00
										 |  |  |   return { | 
					
						
							|  |  |  |     ...transformContents(wrap, poly), | 
					
						
							|  |  |  |     head: wrap(poly.head), | 
					
						
							|  |  |  |     tail: wrap(poly.tail) | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | module.exports = { | 
					
						
							|  |  |  |   createPoly, | 
					
						
							|  |  |  |   isPoly, | 
					
						
							|  |  |  |   setContent, | 
					
						
							|  |  |  |   setExt, | 
					
						
							| 
									
										
										
										
											2021-06-05 20:15:13 +02:00
										 |  |  |   setImportedFiles, | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  |   compileHeadTail, | 
					
						
							|  |  |  |   transformContents, | 
					
						
							| 
									
										
										
										
											2021-05-31 17:46:26 +02:00
										 |  |  |   transformHeadTailAndContents | 
					
						
							| 
									
										
										
										
											2020-06-13 11:27:15 +02:00
										 |  |  | }; |