| 
									
										
										
										
											2021-09-13 14:45:33 +02:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const Promise = require("bluebird"); | 
					
						
							|  |  |  | const fs = require("fs").promises; | 
					
						
							|  |  |  | const postcss = require('postcss'); | 
					
						
							|  |  |  | const {parse} = require("postcss-scss"); | 
					
						
							| 
									
										
										
										
											2021-09-24 13:14:20 +02:00
										 |  |  | const argv = require('minimist')(process.argv.slice(2)); | 
					
						
							| 
									
										
										
										
											2021-09-13 14:45:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  | 	Bundle all postCSS files under the `templates/` directory separately, each prepended with the (variable) contents of ./colors.css | 
					
						
							|  |  |  | 	Outputs in plain CSS are in `build/`, split by template | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const postcssPlugins = ["postcss-strip-inline-comments", "postcss-nested", "postcss-simple-vars", "postcss-color-function"].map((plugin) => require(plugin)()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getTemplates() { | 
					
						
							|  |  |  | 	return fs.readdir(`${__dirname}/templates`).then((templates) => { | 
					
						
							|  |  |  | 		return templates.map((a) => { | 
					
						
							|  |  |  | 			return [a, `${__dirname}/templates/${a}`]; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | getTemplates(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function bundle([template, path]) { | 
					
						
							|  |  |  | 	return Promise.try(() => { | 
					
						
							|  |  |  | 		return Promise.all([ | 
					
						
							|  |  |  | 			fs.readFile(`${__dirname}/colors.css`, "utf-8"), | 
					
						
							|  |  |  | 			fs.readFile(path, "utf-8") | 
					
						
							|  |  |  | 		]); | 
					
						
							|  |  |  | 	}).then(([colors, style]) => { | 
					
						
							|  |  |  | 		return parse(colors + "\n" + style); | 
					
						
							|  |  |  | 	}).then((ast) => { | 
					
						
							|  |  |  | 		return postcss(postcssPlugins).process(ast, { | 
					
						
							|  |  |  | 			from: template, | 
					
						
							|  |  |  | 			to: template | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}).then((bundle) => { | 
					
						
							|  |  |  | 		return fs.writeFile(`${buildDir}/${template}`, bundle.css); | 
					
						
							|  |  |  | 	}).then(() => { | 
					
						
							|  |  |  | 		console.log(`Finished writing CSS to ${buildDir}/${template}`); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-24 13:14:20 +02:00
										 |  |  | let buildDir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // try reading from arguments first
 | 
					
						
							|  |  |  | if (argv["build-dir"] != undefined) { | 
					
						
							|  |  |  | 	buildDir = argv["build-dir"] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // then try reading from environment variable
 | 
					
						
							|  |  |  | if (buildDir == undefined) { | 
					
						
							|  |  |  | 	buildDir = process.env.BUILD_DIR; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // then take default
 | 
					
						
							| 
									
										
										
										
											2021-09-13 14:45:33 +02:00
										 |  |  | if (buildDir == undefined) { | 
					
						
							|  |  |  | 	buildDir = `${__dirname}/build`; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-09-24 13:14:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-13 14:45:33 +02:00
										 |  |  | console.log("bundling to", buildDir); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function bundleAll() { | 
					
						
							|  |  |  | 	return getTemplates().then((templates) => { | 
					
						
							|  |  |  | 		return Promise.map(templates, bundle); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (process.env.NODE_ENV != "development") { | 
					
						
							|  |  |  | 	bundleAll(); | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  | 	const chokidar = require("chokidar"); | 
					
						
							|  |  |  | 	console.log("Watching for changes"); | 
					
						
							|  |  |  | 	chokidar.watch(`${__dirname}/templates`).on("all", (_, path) => { | 
					
						
							|  |  |  | 		if (path.endsWith(".css")) { | 
					
						
							|  |  |  | 			bundle([path.split("/").slice(-1)[0], path]); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | 	chokidar.watch(`${__dirname}/colors.css`).on("all", () => { | 
					
						
							|  |  |  | 		console.log("colors.css updated, rebuilding all templates"); | 
					
						
							|  |  |  | 		bundleAll(); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } |