0.1.4 • Published 9 years ago

gromjs v0.1.4

Weekly downloads
2
License
ISC
Repository
github
Last release
9 years ago

#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

0.1.4

9 years ago

0.1.3

9 years ago

0.1.1

9 years ago

0.1.0

9 years ago

0.0.4

9 years ago

0.0.3

9 years ago

0.0.2

9 years ago

0.0.1

9 years ago