NodeJS code building library, focused on simplicicy
nitro
was developed to provide an easy build system for modern languages stack like,
sass, less, coffeescript, or custom stuff through syncronous but fast processing
npm install nitro --save-dev
var nitro = require('nitro');
nitro.dir('src').load('{,**/}*.{sass,scss}')
.process('sass', {
autoprefix: true,// this options applies postCSS autoprefixer plugin
minify: true, // this options applies postCSS cssnano plugin
groupmedia: true // this applies group-css-media-queries to resulting css
})
.write('public/assets/css');
nitro.dir('src').load('{,**/}*.js')
.process('uglify')
.write('public/js');
nitro.watch('src')
.when('{,**/}*.{scss,sass}', function (filename) {
console.log('sass file', filename, 'has been changed');
})
.when('{,**/}*.js', function (filename) {
console.log('js file', filename, 'has been changed');
})
;
nitro.cwd()
nitro.cwd('path/to/folder', function (cwd) {
console.log('value of cwd should match process.cwd()', cwd === process.cwd() );
});
nitro.exec() allows syncronous execution of shell commands
nitro.exec('ls -la');
nitro.file
var file = nitro.file;
// returns true/false if file exists
file.exists('path/to/file.txt');
// returns file contents
file.read('path/to/file.txt');
// returns JSON parsed file contents
file.readJSON('path/to/file.json');
// writes contents to file
file.write('path/to/file.txt', 'new content');
// writes contents to file in JSON format indented by tabs
file.writeJSON('path/to/file.json', { new: 'content' });
// copies through fs stream file to destination
file.copy('path/to/file.txt', 'destination/file.txt');
// returns a function that matches specified filter (string or array of strings)
file.filter(filter);
nitro.dir() returns a dir object
var dirSrc = nitro.dir('src');
// create sub folders :: returns (boolean)
dirSrc.create('sub/folder');
// check if folder exists :: returns (boolean)
dirSrc.exists();
// copy folder contents to destinarion :: returns (boolean)
// (optional) filter: string using minimatch format (https://github.com/isaacs/minimatch)
// dest: destination folder
dirSrc.copy(filter, dest);
// removes selected directory :: returns dirSrc
dirSrc.remove();
// expand contents of directory :: returns list of files that matches filter
// filter: string or array of strings using minimatch format (https://github.com/isaacs/minimatch)
dirSrc.expand(filter);
// alias of nitro.watch(dirPath, handler)
dirSrc.watch(handler);
// creates an instance of class Files() with files matching the filter :: returns filesList
// filter: string or array of strings using minimatch format (https://github.com/isaacs/minimatch)
dirSrc.load(filter);
// equivalent to nitro.load(filter, { cwd: 'src' });
nitro.load(filter, options)
// creates an instance of class Files() with files matching the filter :: returns filesList
// filter: string or array of strings using minimatch format
var filesList = nitro.load(filter, options)
class Files() instance methods, applied to loaded files
var filesList = nitro.dir('src').load('{,**/}*.js');
// iterate among files in list
filesList.each(function (f) {
// f is an instance of class File()
console.log('filename', f.filename );
console.log('path', f.path );
console.log('src', f.src );
});
// new loaded files (using same cwd) are appended to current list
filesList.load('{,**/}*.coffee');
// is equivalent to: nitro.dir('src').load('{,**/}*.{js,coffee}')
// or to: nitro.dir('src').load(['{,**/}*.js', '{,**/}*.coffee'])
// this applies to both js as compiled coffee to js
filesList.process('uglify');
// you can work with a subset of files and if a new list is returned,
// files will be extracted from initial list and appended to remaining files
filesList.process('{,**/}*.coffee', 'coffee-script');
// writes files in defined folder
filesList.write('destination/folder');
// you can join all files into one by:
filesList.writeFile('destination/folder/bundle.js');
// or through:
filesList.join('bundle.js').write('destination/folder');
// file: make.js
var nitro = require('nitro');
nitro.task('sass', function (target) {
var dev = target === 'dev';
nitro.dir('src').load('{,**/}*.{sass,scss}')
.process('sass', {
autoprefix: true,// this options applies postCSS autoprefixer plugin
minify: !dev, // this options applies postCSS cssnano plugin
groupmedia: true // this applies group-css-media-queries to resulting css
})
.write('public/assets/css');
})
nitro.task('js', function (target) {
var js = nitro.dir('src').load('{,**/}*.js');
if( target === 'dev' ) {
js = js.process('uglify').join('app.js');
}
js.write('public/js');
});
nitro.task('build', ['sass', 'js']);
nitro.task('build-dev', ['sass:dev', 'js:dev']);
nitro.task('watch', function () {
nitro.watch('src')
.when('{,**/}*.{scss,sass}', ['sass:dev'], function (filename) {
console.log('sass file', filename, 'has been changed');
})
.when('{,**/}*.js', ['js:dev'], function (filename) {
console.log('js file', filename, 'has been changed');
});
});
nitro.task('dev', ['build-dev', 'watch'], function () {
nitro.livereload('public', { port: 35729 });
});
nitro.task('live', ['dev'], function () {
nitro.server('public', {
livereload: { port: 35729 },
openInBrowser: true
});
});
// executing shell command
nitro.run();
main options from shell
node make dev
node make live
node make build
make test