|
| 1 | +#!/usr/bin/env node |
| 2 | + |
| 3 | +'use strict' |
| 4 | + |
| 5 | +const autoprefixer = require('autoprefixer'); |
| 6 | +const chalk = require('chalk') |
| 7 | +const fs = require('fs') |
| 8 | +const glob = require('glob') |
| 9 | +const mkdirp = require('mkdirp') |
| 10 | +const path = require('path') |
| 11 | +const postcss = require('postcss'); |
| 12 | +const sass = require('node-sass') |
| 13 | +const sh = require('shelljs') |
| 14 | + |
| 15 | +const basename = path.basename |
| 16 | +const dirname = path.dirname |
| 17 | +const resolve = path.resolve |
| 18 | +const normalize = path.normalize |
| 19 | +const join = path.join |
| 20 | +const relative = path.relative |
| 21 | +const extension = path.extname |
| 22 | + |
| 23 | +const vendors = () => { |
| 24 | + const cwd = 'src/scss/vendors/' |
| 25 | + const pattern = '**/*.scss' |
| 26 | + const ignore = '**/_*.scss' |
| 27 | + const options = { |
| 28 | + cwd: 'src/scss/vendors/', |
| 29 | + ignore: ignore |
| 30 | + } |
| 31 | + const filenames = new glob.sync(pattern, options) |
| 32 | + return filenames.map((filename) => { |
| 33 | + const obj = {} |
| 34 | + obj['dir'] = filename.split('/')[0] |
| 35 | + obj['path'] = resolve(cwd, filename) |
| 36 | + return obj |
| 37 | + }) |
| 38 | +} |
| 39 | + |
| 40 | +const compileSass = (options = {}) => { |
| 41 | + // set default options |
| 42 | + options = Object.assign({ |
| 43 | + style: 'expanded' |
| 44 | + }, options); |
| 45 | + |
| 46 | + // render the result |
| 47 | + let compiled |
| 48 | + try { |
| 49 | + compiled = sass.renderSync({ |
| 50 | + file: options.src, |
| 51 | + outFile: options.dest, |
| 52 | + outputStyle: options.style, |
| 53 | + precision: 6, |
| 54 | + sourceMap: true, |
| 55 | + sourceMapContents: true |
| 56 | + }) |
| 57 | + } catch(e) { |
| 58 | + //Catch error, the process crashed |
| 59 | + const error = ` |
| 60 | + file: ${e.file}, |
| 61 | + line: ${e.line}, |
| 62 | + column: ${e.column}, |
| 63 | + message: ${e.message}, |
| 64 | + formatted: ${e.formatted} |
| 65 | + ` |
| 66 | + console.log(chalk.red(error)) |
| 67 | + return |
| 68 | + } |
| 69 | + |
| 70 | + if (compiled && compiled.css){ |
| 71 | + console.log(chalk.green('Rendering Complete, saving .css file...')) |
| 72 | + console.log(chalk.green(`Wrote CSS to ${options.dest}`)) |
| 73 | + console.log(chalk.green(`Wrote Source Map to ${options.map}`)) |
| 74 | + console.log(`\n`) |
| 75 | + |
| 76 | + // add prefixes |
| 77 | + const prefixed = postcss([ autoprefixer ]).process(compiled.css, { |
| 78 | + from: options.src, |
| 79 | + to: options.dest |
| 80 | + }) |
| 81 | + prefixed.then((result) => { |
| 82 | + result.warnings().forEach((warning) => { |
| 83 | + console.warn(warning.toString()) |
| 84 | + }) |
| 85 | + // write the result to file |
| 86 | + mkdirp(dirname(options.dest), (error) => { |
| 87 | + if (error) return cb(error) |
| 88 | + // create .css file |
| 89 | + fs.writeFile(options.dest,result.css, (error) => { |
| 90 | + if (error) return cb(error) |
| 91 | + }) |
| 92 | + // create .css.map file |
| 93 | + fs.writeFile(options.dest,compiled.map, (error) => { |
| 94 | + if (error) return cb(error) |
| 95 | + }) |
| 96 | + console.log(' ' + options.dest + ' built.'); |
| 97 | + }) |
| 98 | + }) |
| 99 | + } |
| 100 | +} |
| 101 | + |
| 102 | +const compile = (vendors) => { |
| 103 | + vendors.forEach((vendor) => { |
| 104 | + const dest = resolve(__dirname, '..', 'src/vendors', vendor.dir, 'css', path.parse(vendor.path).name) |
| 105 | + // Expanded |
| 106 | + compileSass({ |
| 107 | + src : vendor.path, |
| 108 | + dest: dest + '.css', |
| 109 | + map: dest + '.css.map' |
| 110 | + }); |
| 111 | + |
| 112 | + // Minified |
| 113 | + compileSass({ |
| 114 | + src : vendor.path, |
| 115 | + dest: dest + '.min.css', |
| 116 | + map: dest + '.min.css.map', |
| 117 | + style: 'compressed' |
| 118 | + }); |
| 119 | + }) |
| 120 | +} |
| 121 | + |
| 122 | +const main = () => { |
| 123 | + // vendors() |
| 124 | + compile(vendors()) |
| 125 | +} |
| 126 | + |
| 127 | +main() |
0 commit comments