minimalist-notation
Version:
Minimalist Notation
76 lines (69 loc) • 1.94 kB
JavaScript
const Path = require('path');
const through = require('through2');
const parserProvider = require('../mnParserProvider');
const compileProvider = require('../mnCompileProvider');
const isObject = require('mn-utils/isObject');
const isString = require('mn-utils/isString');
const isArray = require('mn-utils/isArray');
const forEachAsync = require('mn-utils/async/forEach');
const writeFile = require('mn-utils/node/file/promisify/write');
function normalize(v) {
return v ? (isArray(v) ? (v.length ? v : null) : [v]) : null;
}
function gulpMN(outputs, options) {
if (isString(outputs) || isArray(outputs)) {
options || (options = {});
options.output = outputs;
} else {
if (!options && isObject(outputs)) options = outputs;
}
const settings = {
...defaultSettings,
...options,
};
const parse = parserProvider(settings.attrs);
const compile = compileProvider(settings);
outputs = normalize(settings.output);
let data = {};
return through.obj(function(file, enc, cb) {
const {
path,
} = file;
if (
file.isNull()
|| file.isStream()
|| Path.basename(path).indexOf('_') === 0
) {
return cb(null, file);
}
parse(data, file.contents.toString());
cb(null, file);
}, function(cb) {
const content = compile(data);
data = {};
forEachAsync(outputs, (outputFileName) => {
return writeFile(outputFileName, content);
}).then(cb);
});
}
const defaultSettings = gulpMN.defaultSettings = {
output: './mn.styles.css',
selectorPrefix: '',
attrs: {
'className': 'class',
'class': 'class',
'm': 'm',
},
presets: [
require('../presets/prefixes'),
require('../presets/styles'),
require('../presets/medias'),
// require('../presets/states'),
require('../presets/synonyms'),
// require('../presets/main'),
],
onError(e) {
console.error(e);
},
};
module.exports = gulpMN;