sass.js (1951B)
1 'use strict'; 2 3 const universalify = require('universalify'); 4 const sass = require('node-sass'); 5 const globby = require('globby'); 6 const path = require('path'); 7 const fs = require('fs-extra'); 8 const { getSignatures, writeSignatures, cleanUp, compareSignatures, getFileSignature, onSuccess, onError, onProgress, getPathRelativeTo } = require('./utils'); 9 const { ignoreMask } = require('./config'); 10 const sassRender = universalify.fromCallback(sass.render); 11 12 const ROOT = path.resolve(__dirname, '..'); 13 14 async function getSass(source, options, signatures) { 15 const t1 = Date.now(); 16 const files = await globby(source, Object.assign({ cwd: ROOT }, options )); 17 const totalCount = files.length; 18 var count = 0; 19 var f; 20 21 while ((f = files.pop()) != null) { 22 let newFileSignature = await getFileSignature(f); 23 const dest = path.join.apply(this, ['build', 'chrome', 'skin', 'default', 'zotero', 'components', getPathRelativeTo(f, 'scss')]); 24 25 if (f in signatures) { 26 if (compareSignatures(newFileSignature, signatures[f])) { 27 try { 28 await fs.access(dest, fs.constants.F_OK); 29 continue; 30 } catch (_) { 31 // file does not exists in build, fallback to browserifing 32 } 33 } 34 } 35 try { 36 const sass = await sassRender({ 37 file: f 38 }); 39 40 await fs.outputFile(dest, sass); 41 onProgress(f, dest, 'sass'); 42 signatures[f] = newFileSignature; 43 count++; 44 } catch (err) { 45 throw new Error(`Failed on ${f}: ${err}`); 46 } 47 } 48 49 const t2 = Date.now(); 50 return { 51 action: 'sass', 52 count, 53 totalCount, 54 processingTime: t2 - t1 55 }; 56 } 57 58 module.exports = getSass; 59 60 if (require.main === module) { 61 (async () => { 62 try { 63 const signatures = await getSignatures(); 64 onSuccess(await getSass('scss/*.scss', { root: 'scss', ignore: ignoreMask }, signatures)); 65 onSuccess(await cleanUp(signatures)); 66 await writeSignatures(signatures); 67 } catch (err) { 68 process.exitCode = 1; 69 global.isError = true; 70 onError(err); 71 } 72 })(); 73 }