README
CombJS
Tool for combing JavaScript code.
Installation
$ npm install combjs --save
What can that module?
This module can format this code (example):
var Stream = require('stream').Stream
, es = exports
, through = require('through')
, from = require('from')
, duplex = require('duplexer')
, map = require('map-stream')
, pause = require('pause-stream')
, split = require('split')
, pipeline = require('stream-combiner')
, immediately = global.setImmediate || process.nextTick;
es.Stream = Stream //re-export Stream from core
es.through = through
es.from = from
es.duplex = duplex
es.map = map
es.pause = pause
es.split = split
es.pipeline = es.connect = es.pipe = pipeline
// merge / concat
//
// combine multiple streams into a single stream.
// will emit end only once
es.concat = //actually this should be called concat
es.merge = function (/*streams...*/) {
var toMerge = [].slice.call(arguments)
var stream = new Stream()
stream.setMaxListeners(0) // allow adding more than 11 streams
var endCount = 0
stream.writable = stream.readable = true
toMerge.forEach(function (e) {
e.pipe(stream, {end: false})
var ended = false
e.on('end', function () {
ended = true
endCount ++
})
})
stream.write = function (data) {
this.emit('data', data)
}
stream.destroy = function () {
toMerge.forEach(function (e) {
})
}
return stream
}
into:
var Stream = require('stream').Stream,
es = exports,
through = require('through'),
from = require('from'),
duplex = require('duplexer'),
map = require('map-stream'),
pause = require('pause-stream'),
split = require('split'),
pipeline = require('stream-combiner'),
immediately = global.setImmediate || process.nextTick;
es.Stream = Stream;
//re-export Stream from core
es.through = through;
es.from = from;
es.duplex = duplex;
es.map = map;
es.pause = pause;
es.split = split;
es.pipeline = es.connect = es.pipe = pipeline;
// merge / concat
//
// combine multiple streams into a single stream.
// will emit end only once
es.concat = //actually this should be called concat
es.merge = function (/*streams...*/) {
var toMerge = [].slice.call(arguments);
var stream = new Stream();
stream.setMaxListeners(0);
// allow adding more than 11 streams
var endCount = 0;
stream.writable = stream.readable = true;
toMerge.forEach(function (e) {
e.pipe(stream , {
end: false
});
var ended = false;
e.on('end' , function () {
ended = true;
endCount++;
});
});
stream.write = function (data) {
this.emit('data' , data);
};
stream.destroy = function () {
toMerge.forEach(function (e) {});
};
return stream;
};
API
Module will provide the object with method "comb" for combing of a JavaScript code:
combjs.comb(source String, rules Object, progressCallback Function);
Example:
// mkdir example && cd example && npm init && npm install combjs --save
var combjs = require('combjs'),
source = 'var a=1,b=2;',
rules = {
emptylinesAfterCloseBraces: true,
emptylinesAfterMultilineExpressions: true,
emptylinesAfterOpenBraces: true,
emptylinesAfterVariableDefinitions: true,
emptylinesBeforeCloseBraces: true,
emptylinesBeforeComments: true,
emptylinesBeforeMultilineExpressions: true,
emptylinesBeforeVariableDefinitions: true,
indent: 4, // You can define any count of spaces
keywordsBraces: 'inline', // You can define value 'multiline' if needed
linebreaksAfterCloseBraces: true,
linebreaksAfterColon: true,
linebreaksAfterComma: true,
linebreaksAfterMultilineComment: true,
linebreaksAfterOpenBraces: true,
linebreaksAfterSemicolon: true,
linebreaksBeforeCloseBraces: true,
spacesAfterColon: true,
spacesAfterComma: true,
spacesAroundBinaryExpressions: [
'+',
'-',
'/',
'*',
'%',
'<',
'>',
'<=',
'>=',
'==',
'!=',
'===',
'!==',
'<<',
'>>',
'>>>',
'&',
'|',
'^',
'&&',
'||',
'=',
'*=',
'/=',
'%=',
'+=',
'-=',
'<<=',
'>>=',
'>>>=',
'&=',
'^=',
'|='
],
spacesBeforeComma: true,
spacesNearKeywords: true,
stringQuotes: 'single' // You can define value 'double' if needed
};
var combed = combjs.comb(source, rules, function (currentProgress, total) {
console.log('current: ', currentProgress, 'remain: ', total - currentProgress);
});
console.log(combed);
// some stuff with formatted code inside variable "combed"...
You can see full example here: https://github.com/yakimchuk/combjs/blob/master/example-formatter.js
Current available configurations
var config = {
emptylinesAfterCloseBraces: true,
emptylinesAfterMultilineExpressions: true,
emptylinesAfterOpenBraces: true,
emptylinesAfterVariableDefinitions: true,
emptylinesBeforeCloseBraces: true,
emptylinesBeforeComments: true,
emptylinesBeforeMultilineExpressions: true,
emptylinesBeforeVariableDefinitions: true,
indent: 4, // You can define any count of spaces
keywordsBraces: 'inline', // You can define value 'multiline' if needed
linebreaksAfterCloseBraces: true,
linebreaksAfterColon: true,
linebreaksAfterComma: true,
linebreaksAfterMultilineComment: true,
linebreaksAfterOpenBraces: true,
linebreaksAfterSemicolon: true,
linebreaksBeforeCloseBraces: true,
spacesAfterColon: true,
spacesAfterComma: true,
spacesAroundBinaryExpressions: [
'+',
'-',
'/',
'*',
'%',
'<',
'>',
'<=',
'>=',
'==',
'!=',
'===',
'!==',
'<<',
'>>',
'>>>',
'&',
'|',
'^',
'&&',
'||',
'=',
'*=',
'/=',
'%=',
'+=',
'-=',
'<<=',
'>>=',
'>>>=',
'&=',
'^=',
'|='
],
spacesBeforeComma: true,
spacesNearKeywords: true,
stringQuotes: 'single' // You can define value 'double' if needed
};
Contribution
I accept any of your changes. Modify the code, and send pull requests to me :)