92 lines
		
	
	
	
		
			2.7 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			2.7 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* eslint-disable no-await-in-loop */
 | 
						|
 | 
						|
const universalify = require('universalify');
 | 
						|
const sass = require('sass');
 | 
						|
const globby = require('globby');
 | 
						|
const path = require('path');
 | 
						|
const fs = require('fs-extra');
 | 
						|
const { getSignatures, writeSignatures, cleanUp, compareSignatures, getFileSignature, onSuccess, onError, onProgress, getPathRelativeTo } = require('./utils');
 | 
						|
const { scssFiles, ignoreMask } = require('./config');
 | 
						|
const sassRender = universalify.fromCallback(sass.render);
 | 
						|
 | 
						|
const ROOT = path.resolve(__dirname, '..');
 | 
						|
 | 
						|
async function getSass(source, options, signatures={}) {
 | 
						|
	const t1 = Date.now();
 | 
						|
	const files = await globby(source, Object.assign({ cwd: ROOT }, options));
 | 
						|
	const totalCount = files.length;
 | 
						|
	var count = 0, shouldRebuild = false;
 | 
						|
 | 
						|
	for (const f of files) {
 | 
						|
		// if any file changed, rebuild all onSuccess
 | 
						|
		let newFileSignature = await getFileSignature(f);
 | 
						|
		if (!compareSignatures(newFileSignature, signatures[f])) {
 | 
						|
			signatures[f] = newFileSignature;
 | 
						|
			shouldRebuild = true;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	var f;
 | 
						|
	if (shouldRebuild) {
 | 
						|
		const filesToBuild = files.filter(f => !path.basename(f).startsWith('_'));
 | 
						|
		while ((f = filesToBuild.pop())) {
 | 
						|
			let newFileSignature = await getFileSignature(f);
 | 
						|
			let destFile = getPathRelativeTo(f, 'scss');
 | 
						|
			destFile = path.join(path.dirname(destFile), path.basename(destFile, '.scss') + '.css');
 | 
						|
			let dest = path.join.apply(this, ['build', 'chrome', 'skin', 'default', 'zotero', destFile]);
 | 
						|
 | 
						|
			if (['win', 'mac', 'unix'].some(platform => f.endsWith(`-${platform}.scss`))) {
 | 
						|
				let platform = f.slice(f.lastIndexOf('-') + 1, f.lastIndexOf('.'));
 | 
						|
				destFile = destFile.slice(0, destFile.lastIndexOf('-'))
 | 
						|
				+ destFile.slice(destFile.lastIndexOf('-') + 1 + platform.length);
 | 
						|
				dest = path.join.apply(this, ['build', 'chrome', 'content', 'zotero-platform', platform, destFile]);
 | 
						|
			}
 | 
						|
 | 
						|
			try {
 | 
						|
				const sass = await sassRender({
 | 
						|
					file: f,
 | 
						|
					outFile: dest,
 | 
						|
					sourceMap: true,
 | 
						|
					outputStyle: 'compressed'
 | 
						|
				});
 | 
						|
 | 
						|
				await fs.outputFile(dest, sass.css);
 | 
						|
				await fs.outputFile(`${dest}.map`, sass.map);
 | 
						|
				onProgress(f, dest, 'sass');
 | 
						|
				signatures[f] = newFileSignature;
 | 
						|
				count++;
 | 
						|
			}
 | 
						|
			catch (err) {
 | 
						|
				throw new Error(`Failed on ${f}: ${err}`);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	
 | 
						|
	const t2 = Date.now();
 | 
						|
	return {
 | 
						|
		action: 'sass',
 | 
						|
		count,
 | 
						|
		totalCount,
 | 
						|
		processingTime: t2 - t1
 | 
						|
	};
 | 
						|
}
 | 
						|
 | 
						|
module.exports = getSass;
 | 
						|
 | 
						|
if (require.main === module) {
 | 
						|
	(async () => {
 | 
						|
		try {
 | 
						|
			const signatures = await getSignatures();
 | 
						|
			for (var i = 0; i < scssFiles.length; i++) {
 | 
						|
				onSuccess(await getSass(scssFiles[i], { ignore: ignoreMask }, signatures));
 | 
						|
			}
 | 
						|
			onSuccess(await cleanUp(signatures));
 | 
						|
			await writeSignatures(signatures);
 | 
						|
		}
 | 
						|
		catch (err) {
 | 
						|
			process.exitCode = 1;
 | 
						|
			global.isError = true;
 | 
						|
			onError(err);
 | 
						|
		}
 | 
						|
	})();
 | 
						|
}
 |