node package manager
Painless code sharing. npm Orgs help your team discover, share, and reuse code. Create a free org »

gromjs

GROM.js

Awesome co-powered build system.

npm package

npm install -g gromjs

Why?

The goal of grom.js is to be a plugin-less build system that will allow to use any node module to process files without pain. Gives more control

Super simple

In gromfile.js:

var processor = require('files-processor')
var R = require('ramda')
 
module.exports.task = function* (){
  var filesSet = yield this.read(['path/to/files'])
  var mappedFilesSet = filesSet.map(function*(file){
    var newSource = processor(yield file.source())
    return file.clone(newSource, { ext: '.processed'})
  })
 
  return yield this.write('path/to/dist', mappedFilesSet)
}

In terminal:

$ gromjs task

That's it. No special grom-whatever plugins, use whatever you want.

API

  • yield this.read(glob)
    Returns ordered Set of Files

  • yield this.watch(glob)
    Returns events emitter, uses npm module watch and watch.createMonitor method

  • yield this.write(glob, Set)
    Accepts glob, Set of Files and writes everything in right place.

  • yield this.async(tasks)
    Accepts array of tasks and runs in asynchronously and independent to each other.

  • yield this.seq(tasks)
    Runs tasks one by one from left to right, every next one get result from previous.

Set

Is a set of Files uniq by glob, have next methods:

  • elements()
    Returns Set's elements

  • isContains(file)
    Checks if file is in Set by file's glob

  • add(file)
    Returns new Set with all elements plus new one

  • remove(element)
    Returns new Set without single element

  • union(set)
    Returns new Set that is union of elements from both sets

  • intersection(set)
    Returns new Set that is intersection between sets

  • difference(set)
    Returns new Set that is difference between sets

  • filter(interator*)
    Returns new Set with filtered elements

  • sort(interator*)
    Returns new Set with sorted elements

  • reduce(interator*, accumulator)
    Returns reduced value

  • map(interator*)
    Returns new Set with mapped elements

  • forEach(interator*)
    Iterates over elements and returns current Set

File

  • path()
    Returns full path

  • glob()
    Returns glob

  • name()
    Returns name with extension

  • source()
    Generator, returns file's source code

  • clone([glob], [source])
    Creates new File, glob can be presented as hash with dir, name, ext fields which will be merged with parent file's path, path also can be just a string, if glob or source isn't provided, clone takes it from parent.

Examples:

run tasks in sequence:

var filesProcessor = require('files-processor')
 
var read = function* (){
  return yield this.read('/some/path/to/**.ext')
}
 
var processSet = function* (set){
  return set.map(function* (file){
    var source = yield file.source()
    return file.clone(yield extProcessor(source), { ext: 'js' })
  })
}
 
var write = function* (set){
  return yield this.write('/another/path', set)
}
 
module.exports.default = function* three(){
  yield this.seq([read, processSet, write])
}
 

watch files:

 
module.exports.default = function* three(){
  var monitor = yield this.watch('*.js')
  monitor.on('change', function* (Set){
    yield this.async(someTask)
  })
}
 

compile less:

var less = require('less')
 
module.exports.compileLess = function* compileLess (){
  var lessFilesSet = yield this.read('./code/**.less')
 
  var cssFilesSet = yield lessFilesSet.map(function* (file){
    var lessContents = (yield file.source()).toString()
    var css = (yield less.render(lessContents, {})).css
    return file.clone(css, { ext: 'css' })
  })
 
  return yield this.write('./dist', cssFilesSet)
}
 

CLI

 
$ gromjs <task-name>
 

TODO

  • Tasks logger
  • Tests
  • More examples

License

MIT © Dmitriy Kharchenko